Ich versuche, eine Funktion zu entwickeln, mit der ich alle meine Zeichenfolgen zur Desinfektion durchlaufen kann. Damit die Zeichenfolge, die daraus hervorgeht, für das Einfügen in die Datenbank sicher ist. Aber es gibt so viele Filterfunktionen , dass ich nicht sicher bin, welche ich verwenden soll / brauche.
Bitte helfen Sie mir, die Lücken auszufüllen:
function filterThis($string) {
$string = mysql_real_escape_string($string);
$string = htmlentities($string);
etc...
return $string;
}
php
filter
sanitization
Lauren
quelle
quelle
Antworten:
Halt!
Du machst hier einen Fehler. Oh nein, Sie haben die richtigen PHP-Funktionen ausgewählt, um Ihre Daten ein bisschen sicherer zu machen. Das ist gut. Ihr Fehler liegt in der Reihenfolge der Operationen und wie und wo diese Funktionen verwendet werden sollen.
Es ist wichtig, den Unterschied zwischen der Bereinigung und Validierung von Benutzerdaten, dem Entkommen von Daten zur Speicherung und dem Entkommen von Daten zur Präsentation zu verstehen.
Benutzerdaten bereinigen und validieren
Wenn Benutzer Daten übermitteln, müssen Sie sicherstellen, dass sie etwas bereitgestellt haben, das Sie erwarten.
Desinfektion und Filterung
Wenn Sie beispielsweise eine Nummer erwarten, stellen Sie sicher, dass die übermittelten Daten eine Nummer sind . Sie können Benutzerdaten auch in andere Typen umwandeln. Alles, was übermittelt wird, wird anfangs wie eine Zeichenfolge behandelt. Wenn Sie also wissen, dass numerische Daten eine Ganzzahl oder ein Gleitkommawert sind, ist die Bereinigung schnell und problemlos.
Was ist mit Freiform-Textfeldern und Textbereichen? Sie müssen sicherstellen, dass in diesen Feldern nichts Unerwartetes vorhanden ist. Hauptsächlich müssen Sie sicherstellen, dass Felder, die keinen HTML-Inhalt enthalten sollten, kein HTML enthalten. Es gibt zwei Möglichkeiten, wie Sie mit diesem Problem umgehen können.
Zunächst können Sie versuchen , HTML-Eingaben mit zu umgehen
htmlspecialchars
. Sie solltenhtmlentities
HTML nicht zum Neutralisieren verwenden, da es auch die Codierung von akzentuierten und anderen Zeichen ausführt, von denen es glaubt, dass sie ebenfalls codiert werden müssen.Zweitens können Sie versuchen , jegliches mögliche HTML zu entfernen .
strip_tags
ist schnell und einfach, aber auch schlampig. HTML Purifier erledigt viel gründlicher sowohl das Entfernen von HTML als auch das Durchführen einer selektiven Whitelist von Tags und Attributen.Moderne PHP-Versionen werden mit der Filtererweiterung geliefert , die eine umfassende Möglichkeit bietet, Benutzereingaben zu bereinigen.
Validierung
Es ist nur die Hälfte des Auftrags, sicherzustellen, dass die übermittelten Daten frei von unerwarteten Inhalten sind. Sie müssen auch versuchen, sicherzustellen, dass die übermittelten Daten Werte enthalten, mit denen Sie tatsächlich arbeiten können.
Wenn Sie eine Zahl zwischen 1 und 10 erwarten, müssen Sie diesen Wert überprüfen. Wenn Sie eine dieser neuen ausgefallenen numerischen Eingaben aus der HTML5-Ära mit einem Drehfeld und Schritten verwenden, stellen Sie sicher, dass die übermittelten Daten mit dem Schritt übereinstimmen.
Wenn diese Daten aus einem Dropdown-Menü stammen, stellen Sie sicher, dass der übermittelte Wert im Menü angezeigt wird.
Was ist mit Texteingaben, die andere Anforderungen erfüllen? Beispielsweise sollten Datumseingaben über
strtotime
oder die DateTime-Klasse validiert werden . Das angegebene Datum sollte zwischen den erwarteten Bereichen liegen. Was ist mit E-Mail-Adressen? Die zuvor erwähnte Filtererweiterung kann prüfen, ob eine Adresse wohlgeformt ist , obwohl ich ein Fan von bin die is_email Bibliothek .Gleiches gilt für alle anderen Formularsteuerelemente. Haben Sie Optionsfelder? Validieren Sie anhand der Liste. Kontrollkästchen haben? Validieren Sie anhand der Liste. Haben Sie eine Datei hochgeladen? Stellen Sie sicher, dass die Datei vom erwarteten Typ ist, und behandeln Sie den Dateinamen wie ungefilterte Benutzerdaten.
Jeder moderne Browser verfügt über einen vollständigen Satz integrierter Entwicklertools, sodass jeder Ihr Formular problemlos bearbeiten kann. Ihr Code sollte davon ausgehen, dass der Benutzer alle clientseitigen Einschränkungen für den Formularinhalt vollständig aufgehoben hat !
Escape-Daten zur Speicherung
Nachdem Sie sichergestellt haben, dass Ihre Daten das erwartete Format haben und nur die erwarteten Werte enthalten, müssen Sie sich Sorgen machen, dass diese Daten gespeichert bleiben.
Jeder einzelne Datenspeichermechanismus verfügt über eine bestimmte Methode, um sicherzustellen, dass Daten ordnungsgemäß maskiert und codiert werden. Wenn Sie SQL erstellen, werden Daten in Abfragen über vorbereitete Anweisungen mit Platzhaltern übergeben .
Eine der besseren Möglichkeiten, mit den meisten SQL-Datenbanken in PHP zu arbeiten, ist die PDO-Erweiterung . Es folgt dem üblichen Muster, eine Anweisung vorzubereiten , Variablen an die Anweisung zu binden und dann die Anweisung und die Variablen an den Server zu senden . Wenn Sie noch nie mit PDO gearbeitet haben, finden Sie hier ein ziemlich gutes MySQL-orientiertes Tutorial .
Einige SQL-Datenbanken haben ihre eigenen speziellen Erweiterungen in PHP, einschließlich SQL Server , PostgreSQL und SQLite 3 . Jede dieser Erweiterungen verfügt über eine vorbereitete Anweisungsunterstützung, die auf dieselbe Weise wie PDO vorbereitet, gebunden und ausgeführt wird. Manchmal müssen Sie diese Erweiterungen anstelle von PDO verwenden, um nicht standardmäßige Funktionen oder Verhaltensweisen zu unterstützen.
MySQL hat auch eigene PHP-Erweiterungen. Zwei davon tatsächlich. Sie möchten immer nur das mit dem Namen mysqli verwenden . Die alte "mysql" -Erweiterung ist veraltet und in der modernen Zeit weder sicher noch vernünftig zu verwenden.
Ich persönlich bin kein Fan von Mysqli. Die Art und Weise, wie vorbereitete Anweisungen variabel gebunden werden, ist unflexibel und kann schmerzhaft sein. Verwenden Sie im Zweifelsfall stattdessen PDO.
Wenn Sie keine SQL-Datenbank zum Speichern Ihrer Daten verwenden, überprüfen Sie die Dokumentation der verwendeten Datenbankschnittstelle, um festzustellen, wie Daten sicher durch sie übertragen werden können.
Stellen Sie nach Möglichkeit sicher, dass Ihre Datenbank Ihre Daten in einem geeigneten Format speichert. Speichern Sie Zahlen in numerischen Feldern. Speichern Sie Daten in Datumsfeldern. Speichern Sie Geld in einem Dezimalfeld, nicht in einem Gleitkommafeld. Lesen Sie in der von Ihrer Datenbank bereitgestellten Dokumentation nach, wie verschiedene Datentypen ordnungsgemäß gespeichert werden.
Daten für die Präsentation entziehen
Jedes Mal, wenn Sie Benutzern Daten anzeigen, müssen Sie sicherstellen, dass die Daten sicher maskiert werden, es sei denn, Sie wissen, dass sie nicht maskiert werden sollten.
Wenn Sie HTML ausgeben, sollten Sie fast immer alle Daten übergeben, die ursprünglich vom Benutzer bereitgestellt wurden
htmlspecialchars
. Tatsächlich sollten Sie dies nur dann nicht tun, wenn Sie wissen, dass der Benutzer HTML bereitgestellt hat und dass Sie wissen, dass es bereits mithilfe einer Whitelist bereinigt wurde.Manchmal müssen Sie Javascript mit PHP generieren. Javascript hat nicht die gleichen Escape-Regeln wie HTML! Ein sicherer Weg, um vom Benutzer bereitgestellte Werte für Javascript über PHP bereitzustellen, ist durch
json_encode
.Und mehr
Die Datenvalidierung weist viel mehr Nuancen auf.
Beispielsweise kann die Zeichensatzcodierung eine große Falle sein . Ihre Anwendung sollte den in " UTF-8 bis zum Ende " beschriebenen Vorgehensweisen folgen . Es gibt hypothetische Angriffe, die auftreten können, wenn Sie Zeichenfolgendaten als falschen Zeichensatz behandeln.
Früher habe ich Browser-Debug-Tools erwähnt. Diese Tools können auch zum Bearbeiten von Cookie-Daten verwendet werden. Cookies sollten als nicht vertrauenswürdige Benutzereingaben behandelt werden .
Datenvalidierung und Escape-Funktion sind nur ein Aspekt der Sicherheit von Webanwendungen. Sie sollten sich mit den Angriffsmethoden für Webanwendungen vertraut machen, damit Sie Schutzmaßnahmen gegen diese aufbauen können.
quelle
<>
nicht jedes Zeichen in seiner Entität zu ersetzenhtmlspecialchars
zweimal anrufen , da er im Teil "Wenn Benutzer Daten senden" und im Teil "Beim Anzeigen der Daten" davon spricht.Die effektivste Bereinigung zur Verhinderung der SQL-Injection ist die Parametrisierung mit
PDO
. Bei Verwendung parametrisierter Abfragen wird die Abfrage von den Daten getrennt, sodass die Gefahr einer SQL-Injection erster Ordnung beseitigt wird.In Bezug auf das Entfernen von HTML
strip_tags
ist dies wahrscheinlich die beste Idee zum Entfernen von HTML, da dadurch einfach alles entfernt wird.htmlentities
macht, wie es sich anhört, damit es auch funktioniert. Wenn Sie analysieren möchten, welches HTML zugelassen werden soll (dh Sie möchten einige Tags zulassen ), sollten Sie einen ausgereiften vorhandenen Parser wie HTML Purifier verwendenquelle
Datenbankeingabe - So verhindern Sie SQL Injection
Sie müssen Benutzereingaben umgehen, bevor Sie sie in die Datenbank einfügen oder aktualisieren. Hier ist ein älterer Weg, dies zu tun. Sie möchten jetzt parametrisierte Abfragen verwenden (wahrscheinlich aus der PDO-Klasse).
Ausgabe aus der Datenbank - So verhindern Sie XSS (Cross Site Scripting)
Verwenden Sie
htmlspecialchars()
nur dann , wenn Daten aus der Datenbank ausgibt. Gleiches gilt für HTML Purifier. Beispiel:Und zum Schluss ... was Sie angefordert haben
Ich muss darauf hinweisen, dass es wirklich keinen einfachen Weg gibt, dies zu erreichen, wenn Sie PDO-Objekte mit parametrisierten Abfragen verwenden (der richtige Weg, dies zu tun). Aber wenn Sie die alte "MySQL" -Methode verwenden, dann ist dies das, was Sie brauchen würden.
quelle
Meine 5 Cent.
Niemand hier versteht, wie es
mysql_real_escape_string
funktioniert. Diese Funktion filtert oder "bereinigt" nichts.Sie können diese Funktion also nicht als Universalfilter verwenden, der Sie vor der Injektion bewahrt.
Sie können es nur verwenden, wenn Sie verstehen, wie es funktioniert und wo es anwendbar ist.
Ich habe die Antwort auf die sehr ähnliche Frage, die ich bereits geschrieben habe: Sollte ich in PHP beim Senden von Zeichenfolgen an die Datenbank mit htmlspecialchars () auf illegale Zeichen achten oder einen regulären Ausdruck verwenden?
Bitte klicken Sie hier, um die vollständige Erklärung zur datenbankseitigen Sicherheit zu erhalten.
Was die HTML-Eigenschaften betrifft - Charles sagt Ihnen zu Recht, dass Sie diese Funktionen trennen sollen.
Stellen Sie sich vor, Sie fügen Daten ein, die vom Administrator generiert wurden und der HTML posten darf. Ihre Funktion wird es verderben.
Obwohl ich von htmlentities abraten würde. Diese Funktion ist längst überholt. Wenn Sie nur ersetzen möchten
<
,>
und"
Zeichen in aus Gründen der HTML - Sicherheit - nutzen Sie die Funktion , die absichtlich zu diesem Zweck entwickelt wurde - eine htmlspecialchars () ein.quelle
mysql_real_escape_string
entgeht benötigten Zeichen innerhalb einer Zeichenfolge. Es ist nicht streng zu filtern oder zu bereinigen, aber eine Zeichenfolge in Anführungszeichen zu setzen ist es auch nicht (und jeder tut es, ich habe so gut wie nie eine Frage dazu gesehen). Wenn wir SQL schreiben, wird also nichts bereinigt? Natürlich nicht. Was die SQL-Injection verhindert, ist die Verwendung vonmysql_real_escape_string
. Auch die beiliegenden Anführungszeichen, aber jeder tut es, und wenn Sie testen, was Sie tun, erhalten Sie einen SQL-Syntaxfehler mit dieser Auslassung. Der wirklich gefährliche Teil wird behandeltmysql_real_escape_string
.WHERE id = 1
? ;)WHERE my_field = two words
(ohne Anführungszeichen), den Syntaxfehler zu erhalten. Ihr Beispiel ist schlecht, weil es keine Anführungszeichen benötigt, sondern nur eine numerische Prüfung. Ich habe auch nicht gesagt, dass die Zitate nutzlos sind. Ich sagte, dass jeder sie verwendet, daher ist dies nicht die Ursache für Probleme bei der SQL-Injection.everyone use them
Sie können Codes hier auf SO überprüfen. Viele Leute verwenden keine Anführungszeichen mit Zahlen. Stelle dir das vor. Bitte denken Sie daran, dass ich hier nicht darüber spreche, was Sie gesagt haben und was nicht. Ich erkläre nur grundlegende Sicherheitsregeln für Datenbanken. Du solltest besser lernen als leer streiten. Niemand erwähnte hier Zitate oder Castings, aber m_r_e_s nur, als ob es magisch wäre. Worüber ich sprecheZum Einfügen in die Datenbank benötigen Sie lediglich
mysql_real_escape_string
(oder verwenden parametrisierte Abfragen). Im Allgemeinen möchten Sie Daten vor dem Speichern nicht ändern. Dies würde passieren, wenn Sie sie verwendenhtmlentities
. Das würde später zu einem verstümmelten Durcheinander führen, wenn Sie eshtmlentities
erneut durchlaufen , um es irgendwo auf einer Webseite anzuzeigen.Verwenden
htmlentities
Sie diese Option, wenn Sie die Daten irgendwo auf einer Webseite anzeigen.Wenn Sie übermittelte Daten irgendwo in einer E-Mail senden, z. B. mit einem Kontaktformular, müssen Sie die Zeilenumbrüche von allen Daten entfernen, die in der Kopfzeile verwendet werden (z. B. Von: Name und E-Mail-Adresse, Unterabschnitt usw.) )
Wenn Sie dies nicht tun, ist es nur eine Frage der Zeit, bis die Spam-Bots Ihr Formular finden und es missbrauchen. Ich habe es auf die harte Tour gelernt.
quelle
1) Mit nativen PHP-Filtern habe ich folgendes Ergebnis erhalten:
(Quellenskript: https: // RunFor github.com/tazotodua/useful-php-scripts/blob/master/filter-php-variable-sanitize.php )
quelle
Dies hängt von der Art der Daten ab, die Sie verwenden. Das allgemein beste zu verwenden wäre
mysqli_real_escape_string
Methode ist, aber Sie wissen beispielsweise, dass kein HTML-Inhalt vorhanden ist. Die Verwendung von strip_tags erhöht die Sicherheit.Sie können auch Zeichen entfernen, von denen Sie wissen, dass sie nicht zulässig sind.
quelle
Ich empfehle immer, ein kleines Validierungspaket wie GUMP zu verwenden: https://github.com/Wixel/GUMP
Erstellen Sie alle Ihre Grundfunktionen rund um eine Bibliothek wie diese und es ist fast unmöglich, die Hygiene zu vergessen. "mysql_real_escape_string" ist nicht die beste Alternative für eine gute Filterung (wie "Your Common Sense" erklärt) - und wenn Sie vergessen, es nur einmal zu verwenden, kann Ihr gesamtes System durch Injektionen und andere böse Angriffe angegriffen werden.
quelle
Für alle, die hier über mysql_real_escape_string sprechen und sich darauf verlassen, müssen Sie beachten, dass diese Funktion auf PHP5 veraltet war und auf PHP7 nicht mehr existiert.
IMHO ist der beste Weg, um diese Aufgabe zu erfüllen, die Verwendung parametrisierter Abfragen mithilfe von PDO für die Interaktion mit der Datenbank. Überprüfen Sie dies: https://phpdelusions.net/pdo_examples/select
Verwenden Sie immer Filter, um Benutzereingaben zu verarbeiten. Siehe http://php.net/manual/es/function.filter-input.php
quelle
mysqli_real_escape_string()
verfügbar ist.Sie verwenden mysql_real_escape_string () in einem Code ähnlich dem folgenden.
Wie in der Dokumentation angegeben, werden Sonderzeichen in der als Argument übergebenen Zeichenfolge unter Berücksichtigung des aktuellen Zeichensatzes der Verbindung ausgeblendet , damit sie sicher in mysql_query () abgelegt werden können . Die Dokumentation fügt hinzu:
Mit htmlentities () werden einige Zeichen in Entitäten konvertiert, wenn Sie eine Zeichenfolge in HTML-Inhalten ausgeben.
quelle
Dies ist eine der Arten, wie ich derzeit übe,
Beispiel:
- E-Mail: Überprüfen Sie, ob die Eingabe im gültigen E-Mail-Format vorliegt.
- Text / Zeichenfolge : Überprüfen Sie, ob nur die Eingabe das Textformat (Zeichenfolge) ist.
- Nummer: Überprüfen Sie, ob nur das Zahlenformat zulässig ist.
- usw. Pelase verweist auf die Bibliothek zur Validierung der PHP-Eingabe vom PHP-Portal.
- Nach der Validierung verwenden Sie bitte die vorbereitete SQL-Anweisung / PDO.
- Wenn Sie fertig sind, stellen Sie sicher, dass Sie die Verbindung beenden und beenden.
- Vergessen Sie nicht, den Ausgabewert zu löschen, sobald Sie fertig sind.
Das ist alles, was ich glaube, genug für die Grundsek. Es sollte alle größeren Angriffe von Hackern verhindern.
Aus Gründen der serverseitigen Sicherheit möchten Sie möglicherweise in Ihrem Apache / htaccess die Zugriffsbeschränkung und die Roboterprävention sowie die Routingprävention festlegen. Neben der Sek. Des Systems auf der Serverseite gibt es viel zu tun für die serverseitige Sicherheit.
Sie können lernen und eine Kopie der Sek von der htaccess-Apache-Sek-Ebene erhalten (allgemeine Rpaktiken).
quelle
quelle
was ist damit?
oder dieses
quelle