2009-08-08 8 views
3

I read that you do not need to validate or sanitize user's input Wenn Sie vorbereitete Anweisungen verwenden.Um die Validierung von Benutzerdaten für vorbereitete Anweisungen zu verstehen

Dies macht jedoch im folgenden Beispiel für mich keinen Sinn.

Der Benutzer gibt seine E-Mail-Adresse an.

ich normal laufen diese

Validation Code

// to validate data 
if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { 
    header("Location: index.php"); 
    die("Wrong email-address"); 
} 

Die Erklärung sagt, dass wir nicht brauchen, um Daten zu überprüfen, ob wir bereit, Aussagen zu verwenden, wie

ohne die

-Code folgt Validierungscode

// to get email-address nad passhash from the db 
$result = pg_prepare($dbconn, "query2", 'SELECT email, passhash_md5 
    FROM users WHERE email = $1 
    AND passhash_md5 = $2;'); 
$result = pg_execute($dbconn, "query2", array($_POST['email'], $_POST['password'])); 
if(!$result) { 
    echo "An error occurred"; 
    exit; 
} 

Ich bin nicht sicher, ob wir den Validierungscode oder nicht im letzten Code benötigen, da wir pg_prepare und pg_execute verwenden.

Müssen Sie Benutzereingaben überprüfen und bereinigen, wenn Sie vorbereitete Anweisungen verwenden?

+0

Vielen Dank für Ihre Antworten! –

Antwort

6

Sie müssen Ihre Daten immer noch überprüfen, müssen sie jedoch nicht bereinigen.

Die Verwendung vorbereiteter Anweisungen verhindert das Einfügen von bösartigem Code, überprüft jedoch nicht, ob die Form sinnvoll ist.

3

Vorbereitete Anweisungen sorgen für böswillige Absicht, aber es liegt immer noch bei Ihnen zu überprüfen, ob Ihr Benutzer das eingibt, was Sie erwarten.

Beispiel: Wenn Sie ein Formular haben, das nach einer Telefonnummer fragt, wird ein Benutzer, der "jkl; asdgfjkladg" eingibt, Ihrer Datenbank keinen Schaden zufügen, aber die Daten sind nutzlos.

Vertrauen Sie Ihren Benutzern nie, das zu tun, was sie tun sollen. Wenn Sie Eingaben von Benutzern akzeptieren, überprüfen Sie, ob sie es richtig machen.

4

Es ist wichtig, die Validierung und Desinfektion zu trennen.

Die Überprüfung stellt sicher, dass der Benutzer den richtigen Datentyp eingegeben hat. In einem Webformular könnte beispielsweise jemand die Antwort einer ausgewählten Eingabe hacken, um einen Wert zu übermitteln, der nicht in der von Ihnen bereitgestellten Auswahl angezeigt wird. Das Validieren könnte diesen Fehler erkennen und dem Benutzer eine entsprechende Fehlermeldung zurückgeben. Der Benutzer könnte auch eine Zeichenfolge in ein Feld eingeben, das einen Zahlenwert erwartet. Wenn Sie dies vor dem Versuch der Abfrage nicht überprüfen, kann die Abfrage fehlschlagen, und es wird schwieriger, die Ursache zu ermitteln und dem Benutzer eine Fehlermeldung zu geben, oder die Abfrage kann im Hintergrund erfolgreich mit ungültigen Daten ausgeführt werden.

Sanitizing stellt sicher, dass die Daten keinen Schaden verursachen, wenn sie der Datenbank hinzugefügt werden (oder später auf der Website angezeigt werden und einen XSS-Angriff oder Ähnliches verursachen). Die Abfrage INSERT INTO people (names) VALUES('$name') wird fehlschlagen, wenn $name = "O'Reilly", aber eine vorbereitete Anweisung wird automatisch das einfache Anführungszeichen entgehen, wenn die Zeichenfolge als Parameter gebunden wird. Bei der Verwendung verschiedener Zeichensätze ist dies besonders wichtig, da möglicherweise mehr als nur die Anführungszeichen und die Schrägstrich-Zeichen Probleme verursachen können, die möglicherweise einen SQL-Injection-Angriff ermöglichen.

Um zu überprüfen, ob der Benutzer tatsächlich eine E-Mail-Adresse eingibt, müssen Sie den Validierungscode beibehalten, da PostgreSQL keine Ahnung hat, dass die eingegebenen Daten eine E-Mail-Adresse sein sollen zu ihm.

Verwandte Themen