Pertanyaan Sandi Pengguna Cleansing


Bagaimana saya harus melarikan diri atau membersihkan kata sandi yang disediakan pengguna sebelum saya memintanya dan menyimpannya dalam database saya?

Ketika pengembang PHP mempertimbangkan untuk memasukkan kata sandi pengguna untuk tujuan keamanan, mereka sering cenderung memikirkan kata sandi seperti mereka akan menggunakan data lain yang disediakan pengguna. Subjek ini sering muncul dalam pertanyaan PHP yang terkait dengan penyimpanan kata sandi; pengembang sering ingin membersihkan kata sandi menggunakan fungsi seperti escape_string()(dalam berbagai iterasi), htmlspecialchars(), addslashes() dan lain-lain sebelum hashing dan menyimpannya di database.


76
2018-04-14 16:08


asal


Jawaban:


Anda tidak boleh melarikan diri, memangkas atau menggunakan mekanisme pembersihan lain 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 berdebat (dan Anda melihatnya di setiap posting di mana data pengguna diterima untuk digunakan dalam sistem Anda) bahwa kita harus membersihkan semua masukan pengguna dan Anda akan tepat untuk setiap bagian informasi lain yang kami terima dari pengguna kami. Kata sandi berbeda. Hashed password tidak dapat menawarkan ancaman injeksi SQL karena string diubah menjadi hash sebelum disimpan dalam database.

Tindakan hashing password adalah tindakan membuat kata sandi aman untuk disimpan dalam database Anda. Fungsi hash tidak memberikan arti khusus untuk setiap byte, jadi tidak perlu dibersihkan dari inputnya untuk alasan keamanan

Jika Anda mengikuti mantra memungkinkan pengguna untuk menggunakan kata sandi / frasa mereka menginginkan dan Anda jangan batasi kata sandi, memungkinkan setiap panjang, sejumlah spasi dan setiap karakter khusus hashing akan membuat kata sandi / passphrase aman tidak peduli apa yang terkandung dalam kata sandi. Pada saat ini hash yang paling umum (default), PASSWORD_BCRYPT, mengubah kata sandi menjadi string lebar 60 karakter yang berisi garam acak bersama dengan informasi kata sandi yang di-hash dan biaya (biaya algoritmik untuk membuat hash):

PASSWORD_BCRYPT digunakan untuk membuat hash kata sandi baru menggunakan algoritma CRYPT_BLOWFISH. Ini akan selalu menghasilkan hash menggunakan format crypt "$ 2thn", yang selalu 60 karakter lebar.

Kebutuhan ruang untuk menyimpan hash dapat berubah karena metode hashing yang berbeda ditambahkan ke fungsi, jadi selalu lebih baik untuk pergi lebih besar pada tipe kolom untuk hash yang tersimpan, seperti VARCHAR(255) atau TEXT.

Anda bisa 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 kuncinya adalah I'm a "dessert topping" & a <floor wax>! (Ada 5 spasi di bagian akhir kata sandi yang tidak ditampilkan di sini.)

Ketika kami menerapkan metode pemangkasan berikut ini, kami mendapatkan beberapa hasil yang 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 &quot;dessert topping&quot; &amp; a &lt;floor wax&gt;!     " // double quotes, ampersand and braces have been changed
string(65) "I'm a &quot;dessert topping&quot; &amp; a &lt;floor wax&gt;!     " // 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 ketika kita mengirim ini password_hash()? Mereka semua mendapatkan hash, seperti yang dilakukan kueri di atas. Masalahnya muncul ketika Anda mencoba memverifikasi kata sandi. Jika kami menggunakan satu atau lebih dari metode ini, kami harus mempekerjakan kembali mereka sebelum membandingkannya password_verify(). Hal berikut 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 seperangkat langkah yang tidak perlu dan akan membuat hash menjadi tidak lebih baik.


Menggunakan versi PHP kurang dari 5,5? Anda dapat menggunakan password_hash()  paket kompatibilitas.

Anda benar-benar tidak boleh menggunakannya MD5 hash kata sandi.


88
2018-04-14 16:08



Sebelum hashing kata sandi, Anda harus menormalkannya seperti yang dijelaskan di bagian 4 dari RFC 7613. Khususnya:

  1. Aturan Pemetaan Tambahan: Setiap contoh ruang non-ASCII HARUS      dipetakan ke ruang ASCII (U + 0020); ruang non-ASCII adalah Unicode apa pun      titik kode yang memiliki kategori umum Unicode "Zs" (dengan      kecuali U + 0020).

dan:

  1. Normalization Rule: Normalisasi Unicode Form C (NFC) HARUS      diterapkan ke semua karakter.

Ini mencoba untuk memastikan bahwa jika pengguna mengetik kata sandi yang sama tetapi menggunakan metode masukan yang berbeda, kata sandi harus tetap diterima.


31
2018-04-14 16:20