Was sind die besten PHP-Eingabesäuberungsfunktionen?
Ich bin sehr neu in PHP/Programmierung mit diesem Gedanken im Hinterkopf bin ich versucht zu kommen mit einer Funktion, dass ich alle meine Saiten durch zu sanatize. So dass der string, der dabei herauskommt, wird sich sicher für die Datenbank einfügen. Aber es gibt so viele Filter-Funktionen gibt, ich bin mir nicht sicher, welche ich verwenden soll/muss. Bitte helfen Sie mir, die Lücken auszufüllen:
function filterThis($string) {
$string = mysql_real_escape_string($string);
$string = htmlentities($string);
etc...
return $string;
}
InformationsquelleAutor der Frage Lauren | 2010-06-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stop!
Du machst hier einen Fehler. Oh, Nein, Sie haben den perfekten PHP-Funktionen, um Ihre Daten etwas sicherer. Das ist in Ordnung. Dein Fehler ist in der Reihenfolge der Operationenund wie und wo Sie diese Funktionen verwenden.
Es ist wichtig zu verstehen den Unterschied zwischen Desinfektion und Validierung von user-Daten, die Daten zur Speicherung und Flucht-Daten für die Präsentation.
Desinfektion und Validierung von User-Daten
Wenn Benutzer Daten übermitteln, die Sie benötigen, um sicherzustellen, dass Sie haben etwas, das Sie erwarten.
- Bereinigung und-Filterung
Zum Beispiel, wenn Sie erwarten, eine Zahl, stellen Sie sicher, dass die gesendeten Daten ist eine Zahl. Sie können auch Darsteller user-Daten in andere Arten. Alles, was eingereicht wird zunächst behandelt wie ein string, so zwingen bekannt-numerische Daten in ein integer oder float macht Bereinigung schnell und schmerzlos.
Was über free-form-text-Felder und Texteingabefelder? Sie müssen sicherstellen, dass es gibt nichts unerwartetes in diesen Bereichen. Vor allem, Sie brauchen, um stellen Sie sicher, dass Felder, die nicht haben sollte jede HTML-Inhalte, die eigentlich nicht in HTML enthalten. Es gibt zwei Möglichkeiten, mit diesem problem umzugehen.
Ersten, können Sie versuchen Flucht HTML-Eingabe mit
htmlspecialchars
. Sie sollten nichthtmlentities
zu neutralisieren, HTML, da wird es auch führen Codierung von Akzenten und anderen Zeichen, dass es denkt, müssen auch codiert werden.Zweitens, können Sie versuchen entfernen mögliche HTML.
strip_tags
ist schnell und einfach, sondern auch schlampig. HTML Purifier hat ein viel Gründliche Arbeit der beiden Strippen aus alle HTML-und ermöglicht auch einen selektiven whitelist für tags und Attribute durch.Modernen PHP-Versionen Schiff mit die filter-Erweiterungdie einen umfassenden Weg zur Bereinigung von Benutzereingaben.
Validierung
Sicherstellen, dass die übermittelten Daten frei von unerwarteten Inhalt ist nur die halbe Arbeit. Sie müssen auch versuchen, und stellen Sie sicher, dass die übermittelten Daten enthält Werte, die Sie tatsächlich arbeiten.
Wenn Sie erwarten, eine Zahl zwischen 1 und 10, die Sie brauchen, um zu überprüfen, dass Wert. Wenn Sie eines dieser neuen, fancy HTML5-ära numerische Eingaben mit einem spinner und Schritte, stellen Sie sicher, dass die übermittelten Daten im Einklang mit den Schritt.
Wenn die Daten kamen aus was sollte ein drop-down-Menü, und stellen Sie sicher, dass die eingereichten value " erschien im Menü.
Was über text-Eingänge, erfüllen andere Bedürfnisse? Zum Beispiel, Datum-Eingaben sollten validiert werden durch
strtotime
oder die DateTime-Klasse. Das Datum sollte zwischen den Bereichen, die Sie erwarten. Was ist mit E-Mail-Adressen? Die zuvor genannten filter-Erweiterung können Sie überprüfen, ob eine Adresse ist wohlgeformt, obwohl ich bin ein fan von die is_email Bibliothek.Das gleiche gilt für alle andere Formular-Steuerelemente. Radio-buttons? Validierung gegen die Liste. Haben die Checkboxen? Validierung gegen die Liste. Haben Sie eine Datei hochladen? Stellen Sie sicher, dass die Datei von einem erwarteten Typ ist, und behandeln Sie den Dateinamen wie den ungefilterten user-Daten.
Jedem modernen browser kommt mit einem kompletten Satz an Entwickler-tools, die direkt in Sie integriert, das macht es sehr einfach für jedermann zu manipulieren, Ihre form. Ihr code sollte davon ausgehen, dass der Benutzer vollständig entfernt alle client-Seite Beschränkungen auf form-Inhalt!
Flucht von Daten für die Speicherung
Nun, dass Sie sich vergewissert haben, dass Ihre Daten in das erwartete format und enthält nur die erwarteten Werte, die Sie brauchen, um sorgen über die anhaltende, die Daten zu Speicher.
Jedes einzelne Daten-storage-Mechanismus hat einen bestimmten Weg, um sicherzustellen, dass Daten korrekt escaped und codiert werden. Wenn Sie erstellen SQL -, dann ist die anerkannte Methode zum übergeben von Daten in Abfragen wird durch prepared statements mit Platzhaltern.
Eines der besseren Möglichkeiten, um die Arbeit mit den meisten SQL-Datenbanken in PHP ist die Die PDO-Erweiterung. Es folgt dem Allgemeinen Muster von die Vorbereitung einer Anweisungdie Bindung von Variablen an die Anweisungdann senden Sie die Anweisung und Variablen an den server. Wenn Sie haven ' T arbeitete mit PDO hier ist eine ziemlich gute MySQL-tutorial orientiert.
Einige SQL-Datenbanken haben Ihre eigene Spezialität Erweiterungen in PHP, einschließlich SQL ServerPostgreSQL und SQLite 3. Jede dieser Erweiterungen hat die prepared Statements unterstützen, funktioniert in der gleichen vorbereiten-bind-execute-Mode als PDO. Manchmal müssen Sie möglicherweise verwenden Sie diese Erweiterungen anstelle von PDO auf die Unterstützung von nicht-standard-Funktionen oder Verhalten.
MySQL hat auch seine eigenen PHP-Erweiterungen. Zwei von Ihnen, in der Tat. Möchten Sie nur jemals verwenden sogenannte mysqli. Die alte "mysql" - Erweiterung wurde veraltet und ist nicht sicher oder gesund verwenden Sie in der modernen ära.
Ich persönlich bin kein fan von mysqli. Der Weg führt es variable Bindung auf prepared statements ist unflexibel und kann ein Schmerz zu verwenden. Wenn Sie Zweifel haben, verwenden Sie PDO statt.
Wenn Sie nicht mit einer SQL-Datenbank zum speichern Ihrer Daten, überprüfen Sie die Dokumentation für die Datenbank-Schnittstelle, die Sie verwenden, um festzustellen, wie sicher die übergabe von Daten durch Sie.
Wenn möglich, stellen Sie sicher, dass Ihre Datenbank speichert Ihre Daten in einem geeigneten format. Speichern von zahlen in numerische Felder ein. Speichern Daten in Datumsfeldern. Store Geld in ein decimal-Feld, nicht eine floating-point-Bereich. Überprüfen Sie die Dokumentation Ihrer Datenbank, wie man richtig speichern Sie verschiedene Datentypen.
Flucht-Daten für die Präsentation
Jedes mal, wenn Sie Daten für Benutzer, müssen Sie sicherstellen, dass die Daten sicher entgangen, es sei denn, Sie wissen , sollte es nicht entgangen sein.
Beim ausstrahlen von HTML haben, sollten Sie fast immer passen alle Daten, die ursprünglich vom Benutzer geliefert wird, durch
htmlspecialchars
. In der Tat, die einzige Zeit, die Sie nicht tun sollten ist, wenn Sie wissendie dem Nutzer zur Verfügung gestellten HTML -, und dass Sie wissendass es bereits sanitized es mit einer whitelist.Manchmal müssen Sie zum generieren von Javascript mit PHP. Javascript nicht in der gleichen Flucht Regeln als HTML! Ein sicherer Weg, um vom Benutzer gelieferten Werte an Javascript über PHP ist durch
die Funktionen json_encode
.Und Mehr
Gibt es viele weitere Nuancen zur Validierung von Daten.
Beispielsweise Zeichensatz-Codierung kann eine große Falle. Sollte Ihre Bewerbung Folgen Sie dem Verfahren wie in "UTF-8 den ganzen Weg durch". Es gibt hypothetische Angriffe, die auftreten können, wenn Sie die Behandlung von string-Daten als die falschen Zeichen gesetzt.
Ich habe bereits erwähnt browser debug tools. Diese tools können auch verwendet werden, um zu manipulieren, cookie-Daten. Cookies behandelt werden sollen, als nicht Vertrauenswürdige Benutzer-Eingabe.
Daten-Validierung und escaping sind nur ein Aspekt der Sicherheit von web-Anwendungen. Machen Sie sich bewusst,web application attack-Methodenso dass Sie bauen Abwehrkräfte gegen Sie.
InformationsquelleAutor der Antwort Charles
Die meisten effektiv-Bereinigung um zu verhindern, dass SQL-injection ist die Parametrierung mit
PDO
. Mit parametrisierten Abfragen, die Abfrage von den Daten getrennt, so dass Sie entfernt die Bedrohung der first-order SQL-injection.In Bezug auf das entfernen von HTML -
strip_tags
ist wahrscheinlich die beste Idee für das entfernen von HTML, da wird es nur alles entfernen.htmlentities
tut, was es klingt wie, so, das funktioniert auch. Wenn Sie brauchen, um zu analysieren, welche HTML zu erlauben (das ist die, die Sie zulassen möchten einige - tags) verwenden, sollten Sie einen Reifen vorhandenen parser wie HTML PurifierInformationsquelleAutor der Antwort Derek H
Von Datenbank-Input - How, um SQL-Injection verhindern
Müssen Sie entkommen Benutzereingaben vor dem einfügen oder aktualisieren in die Datenbank. Hier ist ein älterer Weg, es zu tun. Würden Sie wollen, um parametrisierte Abfragen jetzt (wahrscheinlich von der PDO-Klasse).
Ausgabe von Datenbank - Wie Sie verhindern, dass XSS (Cross Site Scripting)
Verwenden
htmlspecialchars()
nur bei der Ausgabe von Daten aus der Datenbank. Das gleiche gilt für den HTML Purifier. Beispiel:Und Schließlich... was Sie anzubieten
Muss ich anmerken, dass, wenn Sie PDO-Objekte mit parametrisierten Abfragen (die richtige Weise, es zu tun), dann gibt es wirklich keinen einfachen Weg um dies zu erreichen leicht. Aber wenn Sie die alten 'mysql' Weg, dann ist dies, was Sie brauchen würde.
InformationsquelleAutor der Antwort Joe Phillips
Meine 5 Cent.
Niemand hier versteht, wie
mysql_real_escape_string
funktioniert. Diese Funktion nicht filtern oder zu "bereinigen" nichts.So, Sie können diese Funktion nicht verwenden, wie einige universal-filter, sparen Sie von der Injektion.
Können Sie es verwenden, nur wenn Sie verstehen, wie in Werken, und wo Sie anwendbar ist.
Ich habe die Antwort auf die sehr ähnliche Frage schrieb ich bereits:
In PHP bei der Einreichung von strings an die Datenbank Pflege ich illegale Zeichen, die mit htmlspecialchars() oder einen regulären Ausdruck verwenden?
Bitte klicken Sie hier für die vollständige Erklärung für die Datenbank Seite Sicherheit.
Als für die htmlentities - Charles ist richtig, dass Sie das trennen dieser Funktionen.
Stellen Sie sich vor Sie gehen zum einfügen von Daten, erzeugt durch admin, wer darf die post HTML. Ihre Funktion wird es verderben.
Allerdings würd ich abraten htmlentities. Mit dieser Funktion werden veraltet vor langer Zeit. Wenn Sie möchten, ersetzen Sie nur
<
>
und"
Zeichen im Interesse der HTML-Sicherheit - verwenden Sie die Funktion, die entwickelt wurde, absichtlich für diesen Zweck - ein htmlspecialchars ().InformationsquelleAutor der Antwort Your Common Sense
Für Datenbank einfügen, alles, was Sie brauchen, ist
mysql_real_escape_string
(oder verwenden Sie parametrisierte Abfragen). Im Allgemeinen werden Sie nicht ändern wollen Daten vor dem speichern, was passieren würde, wenn Sie verwendet werdenhtmlentities
. Das führt zu einem unleserlichen Durcheinander später, wenn Sie lief es durchhtmlentities
wieder anzuzeigen, es irgendwo auf einer Webseite.Verwenden
htmlentities
wenn Sie die Anzeige der Daten auf einer Webseite irgendwo.Etwas im Zusammenhang, wenn Sie das senden von Daten irgendwo in einer E-Mail, wie mit einem Kontakt-Formular, zum Beispiel, werden Sie sicher, dass der Streifen Zeilenumbrüche von Daten, die verwendet werden in den header (wie die Von: name und E-Mail-Adresse, subect, etc)
Wenn Sie dies nicht tun, es ist nur eine Frage der Zeit, bis die spam-bots finden Sie Ihre form und Missbrauch, habe ich die harte Tour gelernt.
InformationsquelleAutor der Antwort Rob
1) die Verwendung von native php Filterich habe das folgende Ergebnis :
(Quelle Skript: https://RunForgithub.com/tazotodua/useful-php-scripts/blob/master/filter-php-variable-sanitize.php)
InformationsquelleAutor der Antwort T.Todua
Hängt es von der Art der Daten, die Sie verwenden. Dem Allgemeinen besten zu verwenden wäre
mysqli_real_escape_string
aber, zum Beispiel, Sie wissen es nicht-HTML-Inhalte, mit strip_tags werden noch zusätzliche Sicherheit.Können Sie auch entfernen Sie die Zeichen, die Sie wissen, nicht erlaubt werden sollte.
InformationsquelleAutor der Antwort Aaron Harun
Ich immer empfehlen, mit einer kleinen Validierung Paket wie GUMP:
https://github.com/Wixel/GUMP
Bauen alle grundlegenden Funktionen, um eine Bibliothek wie diese, und ist fast unmöglich zu vergessen Abwasserentsorgung.
"mysql_real_escape_string" nicht die beste alternative für eine gute Filterung (Wie "Ihren gesunden Menschenverstand" erklärt) - und wenn Sie vergessen haben, verwenden Sie es nur einmal, Eure ganze system angreifbar durch Injektionen und andere böse Angriffe.
InformationsquelleAutor der Antwort Simon Schneider
Verwenden Sie mysql_real_escape_string() in ähnlichen code wie den folgenden ein.
Wie die Dokumentation sagt, Ihr Zweck ist escaping von Sonderzeichen in der Zeichenkette als argument übergeben wird, unter Berücksichtigung des aktuellen Zeichensatzes der Verbindung, so dass es sicher ist, um es in eine mysql_query(). Die Dokumentation fügt an:
htmlentities() wird verwendet, um zu konvertieren einige Zeichen in Entitäten bei der Ausgabe von einem string in HTML-Inhalt.
InformationsquelleAutor der Antwort kiamlaluno