Mysql
 sql >> Baza danych >  >> RDS >> Mysql

PHP i MySQL porównaj hasło

Widzę, że przechowujesz skrót hasła w bazie danych, ale dla dobra innych czytelników nigdy przechowuj hasła w postaci zwykłego tekstu w bazie danych. Nie chcesz być jak Monster.com.uk !

Powinieneś użyć silniejszej funkcji mieszającej niż MD5() . Idealnie powinieneś użyć SHA256. Ta metoda skrótu jest dostępna w PHP przy użyciu hash() funkcja.

Powinieneś również zastosować losową sól do hasła. Przechowuj inną wartość soli dla każdego konta użytkownika. Pomaga to pokonać ataki słownikowe i tęczowy stół ataki.

Powinieneś nauczyć się używać mysqli rozszerzenie zamiast starego rozszerzenia mysql. Mysqli obsługuje zapytania parametryczne, dzięki czemu możesz zmniejszyć podatność na niektóre ataki typu SQL injection.

Oto przykładowy kod. Nie testowałem tego, ale powinno być całkiem blisko pracy:

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

Niektórzy sugerują, że zapytanie powinno testować login = ? AND password = ? ale nie lubię tego robić. Jeśli to zrobisz, nie będziesz wiedzieć, czy wyszukiwanie nie powiodło się, ponieważ login nie istniał lub ponieważ użytkownik podał nieprawidłowe hasło.

Oczywiście nie powinieneś ujawniać użytkownikowi, który spowodował nieudaną próbę logowania, ale ty może potrzebować wiedzieć, abyś mógł rejestrować podejrzaną aktywność.

@Javier mówi w swojej odpowiedzi, że nie powinieneś pobierać hasła (lub w tym przypadku skrótu hasła) z bazy danych. Nie zgadzam się.

Javier pokazuje wywołanie md5() w kodzie PHP i wysyłając wynikowy ciąg haszujący do bazy danych. Ale to nie obsługuje łatwego solenia hasła. Musisz wykonać oddzielne zapytanie, aby pobrać sól tego użytkownika, zanim będziesz mógł wykonać hash w PHP.

Alternatywą jest wysłanie zwykłego tekstu hasło przez sieć z aplikacji PHP na serwer bazy danych. Każdy, kto podsłuchuje Twoją sieć, może zobaczyć to hasło. Jeśli masz rejestrowane zapytania SQL, każdy, kto uzyska dostęp do dzienników, może zobaczyć hasło. Zmotywowani hakerzy mogą nawet zanurkować w śmietniku, aby znaleźć stare nośniki kopii zapasowych systemu plików i mogą w ten sposób odczytać pliki dziennika!

Mniejsze ryzyko polega na pobraniu ciągu skrótu hasła z bazy danych do aplikacji PHP, porównaniu go z hashem danych wejściowych użytkownika (także w kodzie PHP), a następnie odrzuceniu tych zmiennych.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytania dotyczące wydajności Phalcon

  2. Git bash w systemie Windows 7. Polecenie mysqldump nie działa

  3. Awaria MySQL podczas uruchamiania

  4. Jak stworzyć bazę danych mysql za pomocą sequelize (nodejs)

  5. Jak zaktualizować tabelę przestawną za pomocą Eloquent w laravel 5