Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

PHP &MySQL membandingkan kata sandi

Saya melihat Anda menyimpan hash kata sandi di database, tetapi untuk kepentingan pembaca lain, tidak pernah menyimpan kata sandi dalam teks biasa di database. Anda tidak ingin menjadi seperti Monster.com.uk !

Anda harus menggunakan fungsi hashing yang lebih kuat daripada MD5() . Idealnya Anda harus menggunakan SHA256. Metode hash ini tersedia di PHP menggunakan hash() fungsi.

Anda juga harus menerapkan garam secara acak ke kata sandi. Simpan nilai garam yang berbeda untuk setiap akun pengguna. Ini membantu untuk mengalahkan serangan kamus dan meja pelangi serangan.

Anda harus belajar menggunakan mysqli ekstensi alih-alih ekstensi mysql lama. Mysqli mendukung kueri berparameter, sehingga Anda dapat mengurangi kerentanan terhadap beberapa serangan injeksi SQL.

Berikut adalah beberapa contoh kode. Saya belum mengujinya, tetapi seharusnya hampir berfungsi:

$input_login = $_POST['login'];
$input_password = $_POST['password'];

$stmt = $mysqli->prepare("SELECT password, salt FROM customer WHERE login = ?");
$stmt->bind_param("s", $input_login);
$stmt->execute();
$stmt->bind_result($password_hash, $salt);

while ($stmt->fetch()) {
  $input_password_hash = hash('sha256', $input_password . $salt);
  if ($input_password_hash == $password_hash) {
    return true;
  }
  // You may want to log failed password attempts here,
  // for security auditing or to lock an account with
  // too many attempts within a short time.
}
$stmt->close();

// No rows matched $input_login, or else password did not match
return false;

Beberapa orang lain menyarankan kueri harus menguji login = ? AND password = ? tapi aku tidak suka melakukan itu. Jika Anda melakukan ini, Anda tidak dapat mengetahui apakah pencarian gagal karena login tidak ada, atau karena pengguna memberikan sandi yang salah.

Tentu saja Anda tidak boleh mengungkapkan kepada pengguna yang menyebabkan upaya login gagal, tetapi Anda mungkin perlu diketahui, sehingga Anda dapat mencatat aktivitas mencurigakan.

@Javier mengatakan dalam jawabannya bahwa Anda tidak boleh mengambil kata sandi (atau hash kata sandi dalam kasus ini) dari database. Saya tidak setuju.

Javier menunjukkan panggilan md5() dalam kode PHP dan mengirimkan hash string yang dihasilkan ke database. Tetapi ini tidak mendukung penggaraman kata sandi dengan mudah. Anda harus melakukan kueri terpisah untuk mengambil garam pengguna ini sebelum Anda dapat melakukan hash di PHP.

Alternatifnya adalah mengirimkan plaintext password melalui jaringan dari aplikasi PHP Anda ke server database Anda. Siapa pun yang menyadap jaringan Anda dapat melihat kata sandi ini. Jika Anda memiliki kueri SQL yang dicatat, siapa pun yang mendapatkan akses ke log dapat melihat kata sandinya. Peretas yang termotivasi bahkan dapat menyelam ke tempat sampah untuk menemukan media cadangan sistem file lama, dan mungkin membaca file log seperti itu!

Risiko yang lebih kecil adalah mengambil string hash kata sandi dari database ke dalam aplikasi PHP, membandingkannya dengan hash dari input pengguna (juga dalam kode PHP), lalu membuang variabel-variabel ini.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP PDO dan MySQLi

  2. Kode Kesalahan:1055 tidak kompatibel dengan sql_mode=only_full_group_by

  3. Situs Penyingkatan URL

  4. Haruskah saya menggunakan tipe data datetime atau timestamp di MySQL?

  5. Hasilkan GUID di MySQL untuk Data yang ada?