Bagaimana cara saya keluar atau membersihkan kata sandi yang diberikan pengguna sebelum saya mencirikannya dan menyimpannya di database saya?
Ketika pengembang PHP mempertimbangkan hashing kata sandi pengguna untuk tujuan keamanan, mereka sering cenderung memikirkan kata sandi itu seperti data lain yang disediakan pengguna. Subjek ini sering muncul dalam pertanyaan PHP terkait dengan penyimpanan kata sandi; pengembang sering kali ingin membersihkan kata sandi menggunakan fungsi seperti escape_string()
(dalam berbagai iterasi) htmlspecialchars()
,, addslashes()
dan lainnya sebelum melakukan hashing dan menyimpannya di database.
Jawaban:
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):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)
atauTEXT
.Anda dapat menggunakan kueri SQL lengkap sebagai kata sandi Anda dan itu akan di-hash, membuatnya tidak dapat dieksekusi oleh mesin SQL misalnya,
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:
Hasil:
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 membandingkannyapassword_verify()
. Berikut ini akan gagal: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 .
sumber
Sebelum melakukan hashing kata sandi, Anda harus menormalkannya seperti yang dijelaskan di bagian 4 dari RFC 7613 . Khususnya:
dan:
Ini mencoba untuk memastikan bahwa jika pengguna mengetik kata sandi yang sama tetapi menggunakan metode input yang berbeda, kata sandi tersebut masih harus diterima.
sumber