Was sind die besten PHP input sanitizing Funktionen?
Ich versuche zu kommen mit einer Funktion, dass ich alle meine Saiten durch zu desinfizieren. So dass der string, der dabei herauskommt, wird sich sicher für die Datenbank einfügen. Aber es gibt so viele Filter-Funktionen, da draußen, ich bin 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;
}
zur insertion, es ist in Ordnung, nur desinfizieren gegen SQL-injection mit mysql_real_escape_string. Es ist, wenn Sie die Ausgewählten Daten (in der html-Ausgabe oder in einer php-Formel/Funktion) sollten Sie in htmlentities
Siehe stackoverflow.com/questions/60174/... für eine Antwort spezifisch für die Reinigung, für die Datenbank einfügen (es gibt ein Beispiel von PDO, das haben andere, die unten erwähnt werden).
Siehe stackoverflow.com/questions/60174/... für eine Antwort spezifisch für die Reinigung, für die Datenbank einfügen (es gibt ein Beispiel von PDO, das haben andere, die unten erwähnt werden).
InformationsquelleAutor 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 Operationen, und 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-Erweiterung, die 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 Anweisung, die Bindung von Variablen an die Anweisung, dann 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 Server, PostgreSQL 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 wissen, die dem Nutzer zur Verfügung gestellten HTML -, und dass Sie wissen, dass 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-Methoden, so dass Sie bauen Abwehrkräfte gegen Sie.
Und nicht mit htmlentities auf alle, ersetzen Sie es mit htmlspecialchars im Austausch nur
<>
nicht jeder Charakter zu seiner PersonNur sicher sein, nicht nennen
htmlspecialchars
zweimal, weil er sagt, Sie "Wenn der Benutzer Daten senden-Teil" und in der "Anzeige der Daten" - Teil.Von Ihnen positiv bewertet werden. Die hilfreichste Antwort, die ich gelesen habe von vielen Q&A(s) in Bezug auf SQL-Injection.
Absolut Hochwertige Antwort mit vielen Erklärungen und links für die künftigen Nutzer, um mehr Optionen. Bekam einen up von mir auch...
InformationsquelleAutor 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 PurifierSollten Sie nicht nur Streifen HTML-Ausgabe? IMO sollte man nie ändern, Eingabe von Daten - Sie wissen nie, Wann Sie es benötigen
InformationsquelleAutor 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 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 ().mysql_real_escape_string
entweicht benötigt Zeichen in einem string. Es ist nicht, streng zu filtern oder zu bereinigen, aber umschließt eine Zeichenfolge in Anführungszeichen, weder ist (und jeder der es tut, habe ich ziemlich viel sah nie eine Frage). Also nichts ist steril, wenn wir SQL schreiben? Natürlich nicht. Was verhindert, dass die SQL-injection ist der Einsatz vonmysql_real_escape_string
. Auch die umschließenden Anführungszeichen, aber jeder macht es, und wenn Sie testen, was Sie tun, Sie am Ende mit einem SQL-syntax-Fehler mit dieser Unterlassung. Die wirklich gefährlichen Teil ist behandelt mitmysql_real_escape_string
.sorry pal, Sie verstehen nicht, eine Sache. Sie verstehen nicht, die Art und Weise mysql_real_escape_string arbeiten. Diese "Zeichen" SIND Zitate. Nicht diese Funktion noch Zitate allein bereinigt alles. Diese 2 Dinge funktioniert gemeinsam nur. Abfrage-string nur syntaktisch korrekte, nicht "sicher von der Injektion". Und was syntax-Fehler würde ich bekommen für
WHERE id = 1
? 😉Versuchen
WHERE my_field = two words
(ohne Anführungszeichen), um die syntax-Fehler. Dein Beispiel ist schlecht, weil es nicht brauche Zitate weder die Flucht, nur eine numerische überprüfen. Auch ich habe nicht gesagt, die Zitate waren nutzlos. Ich sagte, jeder Sie nutzen, so ist dies nicht die Quelle der Probleme in Bezug auf SQL-injection.so, dass ich gesagt habe: Man kann es nur benutzen, wenn Sie verstehen, wie es funktioniert und wo es Anwendung. Sie haben gerade zugegeben, dass mysql_real_escape_string ist nicht überall anwendbar. Für
everyone use them
Sie können check codes hier auf ALSO. Viele Menschen tun nicht verwenden Sie Zitate mit Nummern. Gehen Abbildung. Eine bitte, beachten Sie, dass ich hier gar nicht diskutieren, was Sie gesagt haben und weiss Sie nicht. Ich bin einfach erklären, grundlegende Datenbank-Sicherheits-Regeln. Sie würden besser lernen, statt leere argumentieren. Niemand erwähnt, zitiert oder casting hier aber m_r_e_s nur so, als wäre es Magie. Was ich bin reden überman, genauso wie @Charles. Als Anfänger, Datenbank-Interaktion... die Dinge sicher für die Eingabe und Anzeige von Sonderzeichen, Einspritz-Probleme, hat eine sehr steile Lernkurve. Lesen Sie Ihre post und seinem(wie auch deine anderen PHP-Antworten auf andere Fragen, hat mir geholfen, sehr. Tx für alle Ihre Eingaben.
InformationsquelleAutor 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 Rob
1) die Verwendung von native php Filter, ich habe das folgende Ergebnis :
(Quelle Skript: https://RunForgithub.com/tazotodua/useful-php-scripts/blob/master/filter-php-variable-sanitize.php)
sorry, das war schnell behoben.
InformationsquelleAutor 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 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 Simon Schneider
Für alle diejenigen, die hier reden, sich auf mysql_real_escape_string, die Sie brauchen, um beachten Sie, dass die Funktion veraltet auf PHP5 und nicht mehr existieren auf PHP7.
IMHO der beste Weg, um diese Aufgabe zu erfüllen ist die Verwendung von parametrisierten Abfragen durch die Verwendung von PDO, um mit der Datenbank interagieren.
Überprüfen Sie dies: https://phpdelusions.net/pdo_examples/select
Immer Filter verwenden, um Benutzereingaben verarbeiten.
Sehen http://php.net/manual/es/function.filter-input.php
Hoffe es gefällt Euch!
Ich. Nette Antwort!
Ich empfehlen, zu beachten, dass in PHP 7
mysqli_real_escape_string()
verfügbar ist.Hi Chris, die Lösungen ausgesetzt, hier auf mysql_real_escape_string, bemerkte ich, Lesen Sie von nun an, dass es nicht mehr vorhanden ist auf PHP7 und der vorgeschlagenen alternative mit PDO (und Filter) nicht mysqli. Fühlen Sie sich frei, um eine Notiz hinzuzufügen, zu erklären, eine Lösung über das, was Sie vorschlagen. Grüße
InformationsquelleAutor Kuntur
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 kiamlaluno