742 Stimmen

Sind PDO Prepared Statements ausreichend, um SQL Injection zu verhindern?

Nehmen wir an, ich habe einen Code wie diesen:

$dbh = new PDO("blahblah");

$stmt = $dbh->prepare('SELECT * FROM users where username = :username');
$stmt->execute( array(':username' => $_REQUEST['username']) );

In der PDO-Dokumentation steht:

Die Parameter für vorbereitete Anweisungen müssen nicht in Anführungszeichen gesetzt werden; der Treiber übernimmt dies für Sie.

Ist das wirklich alles, was ich tun muss, um SQL-Injections zu vermeiden? Ist es wirklich so einfach?

Sie können MySQL übernehmen, wenn es einen Unterschied macht. Außerdem bin ich wirklich nur an der Verwendung von vorbereiteten Anweisungen gegen SQL-Injection interessiert. In diesem Zusammenhang interessieren mich XSS oder andere mögliche Schwachstellen nicht.

5 Stimmen

Besserer Ansatz 7. Nummer Antwort stackoverflow.com/questions/134099/

16voto

JimmyJ Punkte 4041

Ich persönlich würde immer zuerst eine Form der Datenbereinigung durchführen, da man Benutzereingaben nie trauen kann. Bei der Verwendung von Platzhaltern/Parameterbindung werden die eingegebenen Daten jedoch getrennt von der Sql-Anweisung an den Server gesendet und dann zusammengebunden. Der Schlüssel hierzu ist, dass die bereitgestellten Daten an einen bestimmten Typ und eine bestimmte Verwendung gebunden werden und keine Möglichkeit besteht, die Logik der SQL-Anweisung zu ändern.

0voto

snipershady Punkte 189

Eaven, wenn Sie Sql-Injection im Front-End verhindern wollen, indem Sie html- oder js-Prüfungen verwenden, müssen Sie berücksichtigen, dass Front-End-Prüfungen "umgehbar" sind.

Sie können js deaktivieren oder ein Muster mit einem Front-End-Entwicklungstool bearbeiten (heutzutage in Firefox oder Chrome integriert).

Also, um zu verhindern, dass SQL-Injektion, wäre richtig zu sanitize Eingabe Datum Backend in Ihrem Controller.

Ich möchte Ihnen vorschlagen, die native PHP-Funktion filter_input() zu verwenden, um die GET- und INPUT-Werte zu reinigen.

Wenn Sie mit der Sicherheit vorankommen wollen, möchte ich Ihnen für sinnvolle Datenbankabfragen vorschlagen, reguläre Ausdrücke zu verwenden, um das Datenformat zu überprüfen. preg_match() wird Ihnen in diesem Fall helfen! Aber seien Sie vorsichtig! Die Regex-Engine ist nicht so leicht. Verwenden Sie sie nur, wenn es nötig ist, sonst wird die Leistung Ihrer Anwendung sinken.

Sicherheit hat ihren Preis, aber verschwenden Sie nicht Ihre Leistung!

Einfaches Beispiel:

wenn Sie doppelt prüfen wollen, ob ein von GET empfangener Wert eine Zahl kleiner als 99 ist if(!preg_match('/[0-9]{1,2}/')){...} ist schwerwiegender als

if (isset($value) && intval($value)) <99) {...}

Die endgültige Antwort lautet also: "Nein! PDO Prepared Statements verhindert nicht alle Arten von Sql-Injection"; Es verhindert keine unerwarteten Werte, sondern nur unerwartete Verkettungen

8 Stimmen

Sie verwechseln SQL-Injection mit etwas anderem, was Ihre Antwort völlig irrelevant macht

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X