Apabila membangunkan aplikasi web, anda selalunya perlu menggunakan PHP untuk berinteraksi dengan pangkalan data MySQL. Apabila berinteraksi dengan pangkalan data, pengesahan pengguna selalunya diperlukan untuk melindungi data sensitif daripada diakses oleh pengguna yang tidak dibenarkan. Semasa pengesahan, salah satu tugas yang paling penting ialah memastikan kata laluan yang dimasukkan oleh pengguna sepadan dengan kata laluan yang disimpan dalam pangkalan data. Dalam artikel ini, kita akan melihat beberapa helah PHP biasa apabila mengesahkan ralat kata laluan SQL.
Apabila menyimpan kata laluan pengguna, anda biasanya tidak boleh menyimpan kata laluan dalam teks yang jelas terus dalam pangkalan data, kerana terdapat risiko ia menjadi dicuri oleh penyerang berniat jahat. Sebaliknya, kita harus menyulitkan kata laluan dan menyimpan kata laluan yang disulitkan dalam pangkalan data. Kaedah penyulitan yang paling biasa menggunakan fungsi cincang.
Fungsi cincang ialah fungsi yang memetakan mesej (atau "teks biasa") sebarang panjang kepada output panjang tetap (biasanya diwakili sebagai perenambelasan atau pengekodan Base64). Output ini selalunya dipanggil nilai hash, nilai hash, atau digest. Ciri fungsi cincang ialah mesej yang sama dipetakan kepada nilai cincang yang sama, tetapi untuk mesej yang berbeza, nilai cincang adalah berbeza.
PHP menyediakan berbilang fungsi cincang, yang paling biasa digunakan ialah md5() dan sha1(). Berikut ialah contoh menggunakan fungsi md5() untuk menyulitkan kata laluan:
$password = '123456'; $encrypted_password = md5($password);
Apabila menyimpan kata laluan ke dalam pangkalan data, kata laluan yang disulitkan harus disimpan. Apabila mengesahkan, kata laluan yang dimasukkan oleh pengguna perlu disulitkan menggunakan fungsi cincang yang sama dan dibandingkan dengan kata laluan yang disimpan dalam pangkalan data. Jika kedua-dua nilai kata laluan adalah sama, ini bermakna kata laluan sepadan, jika tidak, ini bermakna kata laluan tidak sepadan.
Apabila membandingkan kata laluan, anda mesti memberi perhatian kepada susunan input. Contohnya, cincangan dua kata laluan dalam kod berikut tidak sama:
$password = '123456'; $encrypted_password1 = md5($password); $encrypted_password2 = md5($password); if ($encrypted_password1 == $encrypted_password2) { // Passwords match } else { // Passwords don't match }
Ini kerana keadaan dalaman fungsi cincang mungkin berubah antara panggilan fungsi yang berbeza. Oleh itu, anda mesti berhati-hati apabila membandingkan kata laluan.
Satu lagi aspek penting penyulitan kata laluan ialah memilih algoritma yang boleh dipercayai. Secara amnya, algoritma penyulitan dibahagikan kepada dua jenis: simetri dan tidak simetri. Algoritma penyulitan simetri boleh menggunakan kunci yang sama untuk menyulitkan dan menyahsulit data, manakala algoritma penyulitan asimetri menggunakan kunci yang berbeza untuk menyulitkan dan menyahsulit data.
Apabila menyulitkan kata laluan, anda harus mengelak daripada menggunakan algoritma penyulitan boleh balik kerana ini boleh menyebabkan kebocoran kata laluan. Contohnya, kod berikut menyulitkan kata laluan menggunakan algoritma boleh balik:
$password = '123456'; $key = 'some-secret-key'; $encrypted_password = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $password, MCRYPT_MODE_CBC, md5(md5($key))));
Apabila menggunakan kaedah penyulitan ini, terdapat risiko kebocoran kunci. Jika penyerang memperoleh kunci, mereka boleh menyahsulit kata laluan dengan mudah dan mendapat akses kepada sistem.
Apabila memilih algoritma penyulitan, anda juga perlu mempertimbangkan keselamatan fungsi cincang. Walaupun fungsi cincang biasa seperti md5() dan sha1() digunakan secara meluas pada masa lalu, ia tidak lagi selamat apabila kuasa pengkomputeran meningkat. Penyerang boleh memecahkan cincang ini dengan mudah menggunakan teknik kekerasan.
Untuk meningkatkan keselamatan kata laluan, fungsi cincang yang lebih selamat harus digunakan, seperti sha256(), sha384() dan sha512(). Output fungsi cincang ini lebih panjang dan lebih sukar untuk dipecahkan.
Apabila menggunakan fungsi cincang selamat, anda juga harus mempertimbangkan untuk menambah bilangan larian fungsi cincang untuk meningkatkan kekuatan penyulitan. Contohnya, kod berikut menyulitkan kata laluan menggunakan fungsi cincang sha512() dan menambah bilangan larian kepada 1000 kali:
$password = '123456'; $iterations = 1000; $encrypted_password = hash_pbkdf2('sha512', $password, 'some-salt', $iterations, 32);
Di sini, kami menggunakan fungsi hash_pbkdf2() untuk penyulitan cincang , dan tetapkan bilangan larian kepada 1000 kali. Keselamatan kata laluan boleh dipertingkatkan dengan meningkatkan bilangan larian dan menggunakan fungsi cincang yang lebih selamat.
Apabila melakukan pengesahan kata laluan, anda juga perlu memberi perhatian untuk mencegah serangan suntikan SQL. Serangan suntikan SQL berlaku apabila penyerang mengeksploitasi kelemahan dalam bentuk input untuk menyuntik kod berniat jahat ke dalam pertanyaan SQL, dengan itu memperdaya pelaksana pangkalan data untuk melaksanakan operasi berniat jahat. Semasa pengesahan kata laluan, jika data yang dimasukkan oleh pengguna tidak ditapis dengan betul, anda mungkin tertakluk kepada serangan suntikan SQL.
Untuk mengelakkan serangan suntikan SQL, pernyataan yang disediakan harus digunakan. Penyata yang disediakan merujuk kepada menapis dan mengesahkan data yang dimasukkan pengguna dan menukarnya menjadi pernyataan SQL yang selamat sebelum melaksanakan pertanyaan SQL. Prapemprosesan menghalang serangan suntikan SQL dan melindungi pangkalan data daripada serangan berniat jahat.
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password"); $stmt->execute(array(':username' => $username, ':password' => $password)); $row = $stmt->fetch(PDO::FETCH_ASSOC); if($row) { // Password match } else { // Password does not match }
Di sini, kami menggunakan pernyataan yang disediakan PDO untuk melaksanakan pertanyaan SQL dan menapis data yang dimasukkan pengguna dengan mengikat parameter.
Ringkasan
Terdapat beberapa teknik untuk dipilih semasa mengesahkan ralat kata laluan SQL dalam PHP. Kami boleh meningkatkan keselamatan pengesahan kata laluan dengan menggunakan fungsi cincang, mengelakkan penggunaan algoritma penyulitan boleh balik, menggunakan fungsi cincang dengan keselamatan kata laluan yang lebih tinggi dan menghalang serangan suntikan SQL. Apabila melakukan pengesahan kata laluan, penjagaan mesti diambil untuk memastikan kata laluan yang dimasukkan oleh pengguna sepadan dengan kata laluan yang disimpan dalam pangkalan data dan untuk melindungi daripada risiko serangan suntikan SQL.
Atas ialah kandungan terperinci Bincangkan beberapa teknik biasa dalam PHP semasa mengesahkan ralat kata laluan SQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!