Anda tidak boleh melarikan diri, memangkas, atau menggunakan mekanisme pembersihan lainnya pada kata sandi yang akan Anda hashing dengan PHP password_hash()
karena sejumlah alasan, yang terbesar adalah karena melakukan pembersihan tambahan pada kata sandi memerlukan kode tambahan yang tidak perlu.
Anda akan membantah (dan Anda melihatnya di setiap posting di mana data pengguna diterima untuk digunakan di sistem Anda) bahwa kami harus membersihkan semua masukan pengguna dan Anda akan benar untuk setiap informasi lain yang kami terima dari pengguna kami. Kata sandi berbeda. Sandi yang di-hash tidak dapat menawarkan ancaman injeksi SQL karena string diubah menjadi hash sebelum disimpan dalam database.
Tindakan hashing kata sandi adalah tindakan membuat kata sandi aman untuk disimpan di database Anda. Fungsi hash tidak memberikan arti khusus pada byte mana pun, jadi tidak ada pembersihan input yang diperlukan untuk alasan keamanan
Jika Anda mengikuti mantra yang memungkinkan pengguna untuk menggunakan kata sandi / frasa yang mereka inginkan dan Anda tidak membatasi kata sandi , mengizinkan panjang apa pun, sejumlah spasi dan karakter khusus apa pun akan membuat kata sandi / frasa sandi aman apa pun yang terkandung di dalamnya kata sandi. Pada hash yang paling umum (default), PASSWORD_BCRYPT
mengubah kata sandi menjadi string lebar 60 karakter yang berisi salt acak bersama dengan informasi kata sandi yang di-hash dan biaya (biaya algoritmik untuk membuat hash):
PASSWORD_BCRYPT digunakan untuk membuat hash sandi baru menggunakan algoritma CRYPT_BLOWFISH. Ini akan selalu menghasilkan hash menggunakan format crypt "$ 2y $", yang selalu memiliki lebar 60 karakter.
Persyaratan ruang untuk menyimpan hash dapat berubah karena metode pencirian yang berbeda ditambahkan ke fungsi, jadi lebih baik selalu lebih baik untuk memperbesar tipe kolom untuk hash yang disimpan, seperti VARCHAR(255)
atau TEXT
.
Anda dapat menggunakan kueri SQL lengkap sebagai kata sandi Anda dan itu akan di-hash, membuatnya tidak dapat dieksekusi oleh mesin SQL misalnya,
SELECT * FROM `users`;
Bisa di-hash ke $2y$10$1tOKcWUWBW5gBka04tGMO.BH7gs/qjAHZsC5wyG0zmI2C.KgaqU5G
Mari kita lihat bagaimana metode sanitasi yang berbeda memengaruhi kata sandi -
Kata sandinya adalah I'm a "dessert topping" & a <floor wax>!
(Ada 5 spasi di akhir kata sandi yang tidak ditampilkan di sini.)
Saat kami menerapkan metode pemangkasan berikut, kami mendapatkan beberapa hasil yang sangat berbeda:
var_dump(trim($_POST['upassword']));
var_dump(htmlentities($_POST['upassword']));
var_dump(htmlspecialchars($_POST['upassword']));
var_dump(addslashes($_POST['upassword']));
var_dump(strip_tags($_POST['upassword']));
Hasil:
string(40) "I'm a "dessert topping" & a <floor wax>!" // spaces at the end are missing
string(65) "I'm a "dessert topping" & a <floor wax>! " // double quotes, ampersand and braces have been changed
string(65) "I'm a "dessert topping" & a <floor wax>! " // same here
string(48) "I\'m a \"dessert topping\" & a <floor wax>! " // escape characters have been added
string(34) "I'm a "dessert topping" & a ! " // looks like we have something missing
Apa yang terjadi jika kami mengirimkan ini ke password_hash()
? Mereka semua mendapatkan hash, seperti yang dilakukan kueri di atas. Masalahnya muncul saat Anda mencoba memverifikasi kata sandi. Jika kita menggunakan satu atau lebih dari metode ini kita harus menggunakannya kembali sebelum membandingkannya password_verify()
. Berikut ini akan gagal:
password_verify($_POST['upassword'], $hashed_password); // where $hashed_password comes from a database query
Anda harus menjalankan kata sandi yang diposting melalui metode pembersihan yang Anda pilih sebelum menggunakan hasil itu dalam verifikasi kata sandi. Ini adalah serangkaian langkah yang tidak perlu dan tidak akan membuat hash menjadi lebih baik.
Menggunakan versi PHP kurang dari 5,5? Anda dapat menggunakan password_hash()
paket kompatibilitas .
Anda sebaiknya tidak menggunakan hash sandi MD5 .