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.
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
@Andrew Aber ich bin mir ziemlich sicher, was ich bekomme von der Datenbank ist sicher .. Warum sollte nicht sein? –
"Ziemlich sicher" ist einer der Gründe. ;) –