Mysql
 sql >> база данни >  >> RDS >> Mysql

PHP и MySQL парола за сравнение

Виждам, че съхранявате хеш на паролата в базата данни, но в полза на другите читатели, никога съхранявайте пароли в обикновен текст в базата данни. Не искате да сте като Monster.com.uk !

Трябва да използвате по-силна функция за хеширане от MD5() . В идеалния случай трябва да използвате SHA256. Този хеш метод е достъпен в PHP с помощта на hash() функция.

Трябва също да приложите произволна сол към паролата. Съхранявайте различна стойност на солта за акаунта на всеки потребител. Това помага да се победят атаките с речници и таблицата на дъгата атаки.

Трябва да се научите да използвате mysqli разширение вместо старото разширение на mysql. Mysqli поддържа параметризирани заявки, така че можете да намалите уязвимостта към някои атаки с инжектиране на SQL.

Ето малко примерен код. Не съм го тествал, но би трябвало да е доста близо до работа:

$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;

Някои други хора предполагат, че заявката трябва да тества за login = ? AND password = ? но не обичам да правя това. Ако направите това, няма да можете да разберете дали търсенето е неуспешно, защото не е съществувало потребителско име или защото потребителят е предоставил грешна парола.

Разбира се, не трябва да разкривате на потребителя кой е причинил неуспешния опит за влизане, но вие може да се наложи да знаете, за да можете да регистрирате подозрителна дейност.

@Javier казва в отговора си, че не трябва да извличате паролата (или хеша на паролата в този случай) от базата данни. не съм съгласен.

Хавиер показва извикване на md5() в PHP код и изпращане на получения хеш низ към базата данни. Но това не поддържа лесно осоляване на паролата. Трябва да направите отделна заявка, за да извлечете солта на този потребител, преди да можете да направите хеширането в PHP.

Алтернативата е да изпратите открития текст парола през мрежата от вашето PHP приложение към вашия сървър на база данни. Всеки, който подслушва вашата мрежа, може да види тази парола. Ако имате регистрирани SQL заявки, всеки, който получи достъп до регистрационните файлове, може да види паролата. Мотивираните хакери могат дори да се гмурнат в контейнера, за да намерят стари архивни носители на файловата система и може да прочетат регистрационните файлове по този начин!

По-малкият риск е да извлечете хеш низа на паролата от базата данни в приложението PHP, да го сравните с хеша на въведеното от потребителя (също в PHP код) и след това да изхвърлите тези променливи.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL Съхранена процедура с параметри

  2. КОРЕКЦИЯ:MySQL – команда SELECT, отказана на потребителя

  3. Как да задам MySQL като база данни по подразбиране в Rails 3?

  4. Заявка, чувствителна към регистъра на MySQL

  5. Експортирайте база данни с MySQL Workbench с оператори INSERT