sql >> Database teknologi >  >> RDS >> Mysql

PHP &MySQL sammenligne adgangskode

Jeg kan se, at du gemmer en hash af adgangskoden i databasen, men til gavn for andre læsere, aldrig gemme adgangskoder i almindelig tekst i databasen. Du ønsker ikke at være som Monster.com.uk !

Du bør bruge en stærkere hashing-funktion end MD5() . Ideelt set bør du bruge SHA256. Denne hash-metode er tilgængelig i PHP ved hjælp af hash() funktion.

Du bør også anvende et tilfældigt salt til adgangskoden. Gem en forskellig saltværdi for hver brugers konto. Dette hjælper med at besejre ordbogsangreb og regnbuebord angreb.

Du bør lære at bruge mysqli udvidelse i stedet for den gamle mysql udvidelse. Mysqli understøtter parametriserede forespørgsler, så du kan reducere sårbarheden over for nogle SQL-injektionsangreb.

Her er et eksempel på kode. Jeg har ikke testet det, men det burde være ret tæt på at virke:

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

Nogle andre foreslår, at forespørgslen skal teste for login = ? AND password = ? men det kan jeg ikke lide at gøre. Hvis du gør dette, kan du ikke vide, om opslaget mislykkedes, fordi login ikke eksisterede, eller fordi brugeren har angivet en forkert adgangskode.

Selvfølgelig skal du ikke afsløre for brugeren, hvad der forårsagede det mislykkede loginforsøg, men dig skal muligvis vide det, så du kan logge mistænkelig aktivitet.

@Javier siger i sit svar, at du ikke skal hente adgangskoden (eller kodeords-hashen i dette tilfælde) fra databasen. Jeg er ikke enig.

Javier viser kaldende md5() i PHP-kode og sender den resulterende hash-streng til databasen. Men dette understøtter ikke let at salte adgangskoden. Du skal lave en separat forespørgsel for at hente denne brugers salt, før du kan lave hashen i PHP.

Alternativet er at sende ren tekst adgangskode over netværket fra din PHP-app til din databaseserver. Alle, der aflytter dit netværk, kan se denne adgangskode. Hvis du har SQL-forespørgsler, der logges, kan alle, der får adgang til logfilerne, se adgangskoden. Motiverede hackere kan endda dumpster-dykke for at finde gamle filsystem backup-medier og kan læse logfilerne på den måde!

Den mindre risiko er at hente adgangskode-hash-strengen fra databasen til PHP-appen, sammenligne den med hashen af ​​brugerens input (også i PHP-kode) og derefter kassere disse variabler.



  1. MySQL Opdel kommasepareret streng i Temp-tabel

  2. Hvordan pg_sleep_for() virker i PostgreSQL

  3. For mange borde; MySQL kan kun bruge 61 tabeller i en join

  4. Sådan implementeres Teamcity med PostgreSQL for høj tilgængelighed