2010-11-18 3 views
10

Ich habe das vor "filter input, escape output" gelesen, aber filtert Eingang wirklich benötigt, wenn ich PDO mit PHP verwende? Ich dachte, mit PDO muss ich die Eingabe nicht filtern, weil die vorbereitete Anweisung sich um SQL-Injektionen kümmert. Ich denke, "escape output" ist immer noch gültig, aber ist "filter input" noch immer gültig?Ist "filter input, escape output" noch gültig mit PDO

Antwort

9

Ja, es ist immer noch gültig.

Beim Filtern geht es nicht darum, Sicherheitslücken zu schließen, es geht darum, die Datenbank nicht mit Müll zu füllen. Wenn Sie ein Datum erwarten, stellen Sie sicher, dass es mindestens wie ein Datum vor dem Speichern aussieht.

Bei der Escaping-Ausgabe geht es um die Vermeidung von Sicherheitslücken (insbesondere XSS oder Cross Site Scripting).

Also ja, sind beide sehr wichtig und sind völlig unabhängig von SQL Injection (obwohl eine ganze Reihe von Entwicklern noch Filterung verwechseln mit Flucht für SQL-Abfragen und damit noch unter dem Vorbehalt Schwachstelle sein kann) ...

+2

"Beim Filtern geht es nicht darum, Sicherheitslücken zu schließen". Dies kann nicht überbewertet werden. –

+0

@ ircmaxell und @JW, so falsch liege ich in der Annahme, dass Filterung Eingang ist teilweise zu sql Injektion zu verhindern? Du sagst, dass es zwei separate Probleme sind? – sami

+1

@sami: absolut. Sie müssen nicht filtern, um Injektionen zu verhindern (in der Tat, wenn Sie sind, wird es wahrscheinlich nicht in allen Fällen funktionieren), und Sie müssen nicht verhindern, dass Injektionen filtern. Sie schließen sich gegenseitig nicht ein (obwohl eine aggressive Filterung Injektionen verhindern kann, das ist nicht, wofür sie gedacht ist) ... – ircmaxell

3

Je nachdem, was die Daten speichern, kann sie immer noch gültig sein.

Angenommen, Sie haben ein Kommentarfeld und ein Benutzer schreibt eine Nachricht mit HTML-Markup. In diesem Fall würden Sie das HTML-Markup oft aus dem Kommentartext entfernen wollen, auch wenn es schließlich geflüchtet ist (es wird wahrscheinlich nicht sehr gut aussehen).

Es gibt andere Fälle zu, wie wenn Sie ein Telefonnummernfeld haben, können Sie es filtern, so dass es in dem spezifischen Format ist Ihre Anwendung verwendet und so weiter.

3

Filtern Sie immer Benutzereingaben. Immer. Vielleicht schützen Sie sich vor Angriffen oder vielleicht führen Sie eine Validierung von Geschäftsregeln durch. Denken Sie daran, dass es keine Technologie oder Verfahren gibt, die alle Angriffe verhindern, sondern nur Angriffe, die speziell dafür entwickelt wurden. SQL-Injection ist nicht das einzige zu vermeidende Problem.

+0

Könnten Sie mir eine Idee geben, was Sie meinen "SQL-Injektion ist nicht das einzige Problem". Ich verstehe, ich muss Ausgabe entkommen, aber für die Eingabe, was gibt es sonst noch als SQL-Injektion wirklich? Ich dachte nichts. – sami

+1

@sami: Hängt sehr davon ab, was du machst und wie du es machst, aber Benutzereingaben in Systeme im Allgemeinen können Dingen wie Pufferüberlaufangriffen oder anderen Dingen unterliegen, an die der Entwickler vielleicht gar nicht denkt Die Plattform selbst ist möglicherweise nicht für eine ordnungsgemäße Handhabung ausgelegt. Es ist selten, aber die Faustregel bleibt. Traue niemals dem, was ein Benutzer an das System sendet. – David

1

Je nach SQL-Injektion und Sicherheit, wenn Sie PDO ordnungsgemäß mit Bind-Variablen verwenden, Nein müssen Sie nicht bereinigen. Aber wie Jani darauf hingewiesen hat, könnten Sie, abhängig von den Daten, die Sie speichern, beispielsweise ein Textfeld, das HTML nicht erlaubt, Ihre Daten bereinigen oder, falls das Feld eine Zahl sein sollte, parseInt() darauf ausführen oder etwas. Dies wird jedoch nicht für die Sicherheit benötigt, sondern für die eigene Datenbanksicherheit. Es ist irgendwie hässlich, wenn jemand versucht, html in einen Kommentar zu setzen und Sie es ausspucken und Sie sehen > < usw.

+0

beim Ausspucken aus der Datenbank, das ist der "Escape-Ausgang", richtig? – sami

+1

Ja, traditionell mit htmlspecialchars(); – superfro

0

Ja , es entkommt Eingabe, aber nicht sofort wie magic_quotes_gpc. Magic Quotes ist ein schrecklicher Sicherheitsansatz. Schwachstellen hängen stark davon ab, wie die verdorbenen Daten verwendet werden. Sie können niemals eine Funktion haben, die die ganze Zeit über alles repariert. Auch während des Ablaufs der Anwendung kann ein Fall sein, wenn ein andere Funktion untergräbt magic_quotes, wie stripslashes(), base64_decode(), urldecode(), htmlspecialchars_decode($var,ENT_QUOTES); und sogar substr().

Kurz gesagt, Sie müssen den Eingang zum Zeitpunkt der Verwendung immer verlassen. pdo und adodb macht das, und es macht es perfekt.