Benutzerdaten in GET by PHP bereinigen
Wie Sie desinfizieren die Daten in $_GET -Variablen, die von PHP?
Ich desinfizieren nur eine variable über GET durch strip_tags
.
Ich bin mir nicht sicher, ob ich alles desinfizieren oder nicht, denn in der vergangenen Zeit bei der Umsetzung von Daten zu Postgres, das problem war leicht gelöst durch die Verwendung von pg_prepare
.
InformationsquelleAutor der Frage Léo Léopold Hertz 준영 | 2009-08-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du nicht bereinigen von Daten in $_GET. Dies ist ein gängiger Ansatz in PHP Skripten, aber es ist völlig falsch*.
Alle Ihre Variablen bleiben sollte, die im nur-text-form bis zu dem Punkt, wenn Sie einbetten in eine andere Art von string. Es ist nicht eine form der Flucht oder 'Bereinigung', das können alle möglichen Arten von Zeichenfolge, die Sie möglicherweise einbetten Ihre Werte in.
Also, wenn Sie die Einbettung eines string in eine SQL-Abfrage, die Sie brauchen, um es zu entkommen auf dem Weg nach draußen:
Und wenn Sie spucken den string in HTML, die Sie benötigen, zu entkommen, es dann:
Wenn Sie nicht beide die Flucht Schritte auf das $_GET-array zu Beginn, wie empfohlen, von Menschen, die nicht wissen, was Sie tun:
Dann, wenn Sie hatte ein '&' in Ihren Benutzernamen, und es würde geheimnisvoll wiederum in '&' in Ihrer Datenbank, und wenn Sie ein Apostroph in Ihren Benutzernamen, es würde in zwei Apostrophe auf der Seite. Dann, wenn Sie haben ein Formular mit diesen Zeichen ist es leicht, Doppel-escaping Dinge, die, wenn Sie bearbeitet, das ist, warum so viele schlechte PHP-CMS landen mit gebrochenen Artikel-Titel wie "Neue Bücher vom O\\\\\\\\\\\\\\\\\\\'Reilly".
Natürlich, daran zu denken, pg_escape_string oder mysql_real_escape_string und htmlspecialchars jedes mal, wenn Sie senden Sie eine variable aus, ist ein bisschen langweilig, das ist, warum jeder will, es zu tun (falsch) in einem Ort am Anfang des Scriptes. Für die HTML-Ausgabe, können Sie zumindest Tipparbeit ersparen, indem Sie definieren eine Funktion mit einem kurzen Namen, der nicht echo(htmlspecialchars(...)).
Für SQL, du bist besser dran mit parametrierbaren Abfragen. Für Postgres gibt es pg_query_params. Oder ja, prepared statements, wie Sie erwähnt (obwohl ich persönlich finde Sie weniger verwaltbar). So oder so, kann man dann vergessen Sie 'bereinigen' oder escaping für SQL, aber Sie muss immer noch fliehen, wenn Sie einbetten in andere Arten von Zeichenketten, einschließlich HTML.
strip_tags() ist nicht ein guter Weg der Behandlung von Eingaben für HTML-Anzeige. In der Vergangenheit hatte es Sicherheitsprobleme, wie browser-Parser sind eigentlich viel komplizierter in Ihrer interpretation dessen, was ein tag werden können, als Sie vielleicht denken. htmlspecialchars() ist fast immer das richtige zu verwenden, anstatt, so dass, wenn jemand Typen eine weniger-als-Zeichen werden Sie tatsächlich bekommen ein literal kleiner-als-Zeichen und nicht den halben text auf mysteriöse Weise verschwinden.
(*: als allgemeiner Ansatz zur Lösung des injection-Probleme, eh. Natürlich gibt es die domain-spezifische Kontrollen, es lohnt sich auf bestimmte Felder, und es gibt nützliche cleanup-Aufgaben, die Sie tun können, wie das entfernen aller steuerzeichen aus übermittelten Werte. Aber das ist nicht das, was die meisten PHP-Programmierer meinen, durch Bereinigung.)
InformationsquelleAutor der Antwort bobince
Wenn du redest, Desinfektions-Ausgabe, würde ich empfehlen, die Speicherung von Inhalten in der Datenbank in seiner vollen, ohne Umschreibung form, und dann Flucht er (htmlspecialchars oder so), wenn Sie als echo aus den Daten, so dass Sie mehr Optionen für die Ausgabe. Sehen diese Frage für eine Diskussion der Desinfektions - /Flucht-Datenbank-Inhalten.
In Bezug auf die Speicherung in postgres verwenden pg_escape_string auf jede variable in der Abfrage, auf der Flucht zitiert, und in der Regel zum Schutz vor SQL-injection.
Edit:
Meine üblichen Schritte für die Speicherung von Daten in einer Datenbank, und dann abrufen, sind:
Aufruf der Daten aus der Datenbank der Flucht-Funktion (pg_escape_string, mysql_escape_string, etc), auf der Flucht jeden eingehenden $_GET variable in der Abfrage. Beachten Sie, dass diese Funktionen anstelle von addslashes Ergebnisse nicht extra Schrägstriche in den text, wenn in der Datenbank gespeichert.
Wenn man die Daten wieder aus der Datenbank, können Sie einfach htmlspecialchars auf alle ausgegebenen Daten, keine Notwendigkeit zu verwenden stripslashes, da sollte es keine zusätzliche Schrägstriche.
InformationsquelleAutor der Antwort Kazar
Müssen Sie bereinigen alle Anforderungen, nicht nur POST BEKOMMEN.
Können Sie die Funktion htmlentities()die Funktion preg_replace() mit regex, filter-Darsteller:
[]'s
InformationsquelleAutor der Antwort fvox
Desinfizieren Sie Ihre Eingaben nach, wohin es geht.
htmlspecialchars
- und/oderstr_replace
.Gleiche für die POST oder auch Daten aus deiner DB, da die Daten in einer DB sollten in der Regel nicht entgangen sein.
Zwei Dinge, die Sie überprüfen sollten:
[magic_quotes_gpc][1]
aktiviert ist, sollten Sie es entweder abschalten (wenn Sie können) oderstripslashes()
GET, POST und COOKIE-Werte.magic_quotes_gpc
veraltet ist, sollten Sie bereinigt die Daten, die Sie manipulieren, je nach verwenden der Daten.InformationsquelleAutor der Antwort instanceof me