2016-06-08 6 views
0

Ich habe eine Abfrage wie folgt aus:Muss ich eine vorbereitete Anweisung für die Daten verwenden, die ich von der Datenbank bekomme?

$result = $db 
-> prepare("SELECT value FROM mytable WHERE id = ?") 
-> execute(array($id)) 
-> fetch(PDO::FETCH_ASSOC); 

Und ich möchte für eine weitere Abfrage (eine UPDATE Anweisung)$result['value'] als Parameter verwenden. Sollte ich vorbereitete Aussage für diese UPDATE Aussage verwenden? Oder weil ich es aus der Datenbank genommen habe, dann brauche ich es nicht als vorbereitete Aussage zu übergeben?

+8

Ja, Sie sollten immer. Es heißt [Second Level Injection] (http://stackoverflow.com/questions/1871774/what-is-second-level-sql-injection). Gehen Sie niemals davon aus, dass Daten sicher sind. Je. – Andrew

+0

@Andrew Aber ich bin mir ziemlich sicher, was ich bekomme von der Datenbank ist sicher .. Warum sollte nicht sein? –

+4

"Ziemlich sicher" ist einer der Gründe. ;) –

Antwort

0

Ja. Verwenden Sie eine vorbereitete Anweisung mit einem Bind-Platzhalter.

Nur weil ein Wert von einer Datenbank zurückgegeben wird, bedeutet dies nicht, dass der Wert für die Aufnahme in SQL-Text sicher ist.

Möglicherweise haben Sie Domain-Wissen, dass die value Spalte in mytable INTEGER Typ ist, so dass es sicher wäre. Aber im allgemeineren Fall, und für den Leser, der die Definition von mytable nicht kennt, und was value enthalten könnte. Ein Leser Ihres Codes wird davon ausgehen, dass value nicht "sicher" ist. Soweit wir wissen, werden wir so etwas wie diese bekommen könnte:

Robert'); DROP TABLE students; -- 

Jedes Mal, wenn wir sehen, eine Variable in den SQL-Text verknüpft, wollen gehen wir davon aus, dass die Variable könnte etwas anderes als ein Wert enthalten, und Es könnte tatsächlich SQL enthalten. (Oder, wenn wir eine Variable sehen, die in den Text einer SQL-Anweisung verkettet ist, würden wir erwarten, dass sie genau an dem Punkt entkernt wird, an dem sie verkettet wird.)

Also würde das bevorzugte Muster verwendet werden eine vorbereitete Anweisung mit einem Bind-Platzhalter. Das macht es für den Leser eindeutig, dass value tatsächlich ein Wert ist und dass es nicht als SQL-Text interpretiert werden soll.

+0

Sie entkleideten arme kleine Bobby Tische seiner '--' am Ende. (Die Injektion wird höchstwahrscheinlich zu einem Syntaxfehler führen.) –

+0

[** Little Bobby Tables ** (Exploits einer Mutter) https://xkcd.com/327/](https://xkcd.com/327 /) – spencer7593

Verwandte Themen