Frage

Ich brauche die folgenden Authentifizierungs Skript beendet. Ich bin schwach in php / gu, damit ich weiß nicht, wie für die Anzahl der Zeilen zu fragen, eine gleich und dann von den Ergebnissen der Abfrage, um die Session-ID der Einstellung. Ich muss nicht nur die $ _SESSION [ ‚userid‘] gesetzt, sondern auch die [ ‚Unternehmen‘] und die [ ‚security_id‘] als auch von den Ergebnissen.

Hier ist, was ich habe:

$userid   = $_POST['userid'];
$password = $_POST['pass'];
if ( $userid != "" || $password != "" )
{
  $sql = "SELECT * FROM contractors WHERE userid = '" . $userid . "' AND password = '" . $password . "'";
  $result = $dbh->query( $sql );
} else
{
  echo "login failed. Your fingers are too big";
}

Optionale Angaben: Browser: Firefox

War es hilfreich?

Lösung

VERWENDET das nie CODE!

Sie haben eine sehr ernste SQL-Injection dort offen. Jede Benutzereingabe, die Sie treffen, ob von Cookies oder CGI oder , wo , muss desinfiziert werden , bevor es in einer SQL-Anweisung verwendet wird. Ich könnte leicht in dieses System brechen, indem eine Anmeldung mit einem Benutzernamen wie versucht:

user'; UPDATE contractors SET password = '1337'

... nach dem konnte ich dann als jemand anmelden. Sorry, wenn ich klinge aggressiv, aber was dieser Code tut, ist wie zu vergessen, die Haustür in Ihr Unternehmen zu sperren, die wahrscheinlich nicht einmal ein Alarmsystem enthalten.

Beachten Sie, dass es keine Rolle, ob die Eingabe tatsächlich vom Benutzer kommt oder nicht (vielleicht ist es in einer vorgefüllten, verborgen). Aus der Sicht der Sicherheit, alles , die von überall außerhalb kommt hat auf bösartige Eingabe durch den Benutzer.

enthalten betrachtet werden

Soweit ich weiß, müssen Sie die quote Funktion verwenden von PDO zu sanieren richtig die Zeichenfolge. (In MySQL, wäre dies mit mysql_real_escape_string() erfolgen.) Ich bin kein Experte für gU, Geist Dich, jemand bitte korrigieren, wenn ich hier falsch bin.

Auch sollten Sie wahrscheinlich speichern keine Passwörter direkt in der Datenbank, sondern eine Hash-Funktion verwenden, um ein maskiertes Passwort zu erstellen, dann erstellen Sie auch einen Hash aus dem Benutzer-Passwort zur Verfügung gestellt, und die Hashes Übereinstimmen. Sie können die PHP hash Funktion verwenden, um dies zu tun.

Wie bei anderen Fragen, ich weiß nicht, ob der Ansatz, den Sie auf SQL SELECT haben die beste Lösung ist. Ich würde der entsprechende Kennwort des Benutzers nur auswählen und versuchen, dass in dem Programm entsprechen. Ich glaube nicht, dass es ein Fehler in der Methode, die Sie entweder verwenden, aber es scheint nicht nur als logisches, und somit gibt es eine größere Chance auf ich einige Bug fehlen - was im Fall von Passwörter und Logins würden ein Fenster für Exploits erstellen.

Um es auf deine Weise zu tun, müssen Sie feststellen, dass das Ergebnis, das Sie von dem bekommen PDO query ist ein fetchAll , die eine Anordnung der Zeilen zurückgibt, und rechnen, dass. als ich das sagte jedoch, fühlt sich alles für mich wie es für Fehler offen ist, so würde ich mich sicherer fühlen, das Passwort in dem Code zu überprüfen. Es gibt einfach zu viel Abstand vom eigentlichen Passwort passende compasion für meinen Geschmack, in einem solchen sicherheitskritischen Stelle.

Also, auf die das resultierende Passwort für den Benutzer-ID zu erhalten, können Sie PDOStatement fetch() , die den Inhalt der Säule aus dem Ergebnis zurückgibt. Verwenden Sie zum Beispiel PDO::FETCH_ASSOC, um sie in einem assoziativen Array zu erhalten, basierend auf den Spaltennamen.

Hier ist, wie es zu beheben:

$userid_dirty   = $_POST['userid'];
$password_dirty = $_POST['pass'];
$success = false; // This is to make it more clear what the result is at the end
if ($userid != "" || $password != "") {
  $userid = $dbh->quote($userid_dirty);
  $passwordhash = hash('sha256',$password_dirty);
  $sql = "SELECT userid, passwordhash, company, security_id FROM contractors WHERE userid = ".$userid;
  $result = $dbh->query( $sql );
  if ($result) { // Check if result not empty, that userid exists
    $result_array = $result->fetch(PDO::FETCH_ASSOC);
    if ($result_array['PASSWORDHASH'] == $passwordhash) {
       // login success
       $success = true;

       // do all the login stuff here...
       // such as saving $result_array['USERID'], $result_array['COMPANY'], $result_array['SECURITY_ID'] etc. 

    } // else fail, wrong password
  } // else fail, no such user
} else {
  // fail, userid or password missing
  echo ' please enter user id and password.';
}
if (!$success) {
  echo ' login failed.';
}

Natürlich kann der Code ein wenig gereinigt werden, aber das sollte erklären, was getan werden muss. Beachten Sie, dass, da das Passwort sowohl gehasht ist, und nie in der SQL verwendet , ist es nicht wirklich gereinigt werden müssen. Aber ich es verließ dort nur für den Fall, da im ursprünglichen Code es wurde in der Abfrage verwendet.

Beachten Sie, dass der gesamte Code in Bezug auf Speicherung von Passwörtern den Hash zu speichern, anstatt des Passworts geändert werden müssen. Auch wäre es eine sehr gute Idee, einen Salz verwenden zum Passwort hinzugefügt vor Hashing.

Auch bereitgestellt I der Code sbedeuten für pädagogische Zwecke - ich dachte nur, dass Code der klarste Weg war zu erklären, wie dies zu tun. Also nicht verwechseln diese Website als Service-Code anzufordern. :)

Andere Tipps

Der PHP Manual ist eine hervorragende Ressource für PHP zu lernen. Es sieht aus wie Sie ein wenig SQL wissen, und Sie haben von PDO gehört, das ist ein guter Anfang. Wenn Sie Google nach „PDO“ suchen, oder suchen Sie in der PHP-Handbuch für den Begriff, finden Sie im Abschnitt PDO finden des Handbuchs. Es sieht aus wie Sie die ->query Funktion gefunden haben, so jetzt müssen Sie sehen, was das zurückgibt. Gehen zum Manpage rel="nofollow, sehen wir, dass es sich um eine zurück PDOStatement Objekt. Das Wort PDOStatement wird auf die entsprechende Seite im Handbuch helfend verknüpft, die die verfügbaren Methoden für das Objekt enthält. Es gibt eine rowCount() Methode, die wahrscheinlich tun, was Sie wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top