In einem Artikel Ссылка heißt es Folgendes:
Die Verwendung von vorbereiteten Anweisungen in Ihren Anwendungen hat zahlreiche Vorteile, sowohl für die Sicherheit als auch für die Leistung.
Vorbereitete Anweisungen können die Sicherheit erhöhen, indem sie die SQL-Logik von den bereitgestellten Daten trennen. Diese Trennung von Logik und Daten kann dazu beitragen, eine sehr häufige Art von Sicherheitsanfälligkeit zu verhindern, die als SQL-Injection-Angriff bezeichnet wird.
Wenn Sie mit einer Ad-hoc-Abfrage arbeiten, müssen Sie beim Umgang mit den Daten, die Sie vom Benutzer erhalten haben, normalerweise sehr vorsichtig sein. Dies beinhaltet die Verwendung von Funktionen, die alle erforderlichen Störungszeichen wie das einfache Anführungszeichen, das doppelte Anführungszeichen und den umgekehrten Schrägstrich enthalten.
Dies ist im Umgang mit vorbereiteten Anweisungen unnötig. Die Trennung der Daten erlaubt es MySQL, diese Zeichen automatisch zu berücksichtigen und sie müssen nicht mit einer speziellen Funktion maskiert werden.
Bedeutet das, dass ich htmlentities()
oder htmlspecialchars()
nicht brauche?
Aber ich nehme an, dass ich strip_tags()
zu Benutzereingabedaten hinzufügen muss?
Habe ich Recht?
htmlentities
und htmlspecialchars
werden verwendet, um die HTML-Ausgabe zu generieren, die an den Browser gesendet wird.
Vorbereitete Anweisungen werden zum Generieren / Senden von Abfragen an die Datenbank-Engine verwendet.
Beide ermöglichen das Entweichen von Daten; aber sie entkommen nicht für den gleichen Gebrauch.
Nein, vorbereitete Anweisungen (für SQL-Abfragen) hindern Sie nicht daran, htmlspecialchars
/ htmlentities
(für die HTML-Generierung)
Über strip_tags
: Es entfernt Tags aus einer Zeichenfolge, wobei htmlspecialchars
sie in HTML-Entitäten umwandelt.
Diese beiden Funktionen machen nicht dasselbe; Sie sollten wählen, welches Sie verwenden, abhängig von Ihren Bedürfnissen / was Sie bekommen möchten.
Zum Beispiel mit diesem Code:
%Vor%Sie erhalten diese Art von Ausgabe:
%Vor%Im ersten Fall kein Tag; in der zweiten, richtig entkommene.
Und mit einer HTML-Ausgabe:
%Vor%Sie erhalten:
%Vor%Welcher von denen willst du? Das ist die wichtige Frage ;)
Nichts ändert sich für htmlspecialchars()
, weil das für HTML ist, nicht für SQL. Sie müssen HTML immer noch richtig entschlüsseln, und es ist am besten, wenn Sie den HTML-Code generieren, anstatt ihn irgendwie an die Datenbank zu binden.
Wenn Sie vorbereitete Anweisungen verwenden, brauchen Sie mysql_[real_]escape_string()
nicht mehr (vorausgesetzt, Sie bleiben bei den Platzhaltern vorbereiteter Anweisungen und widerstehen der Versuchung, sie mit einer String-Manipulation zu umgehen).
Wenn Sie htmlspecialchars()
loswerden wollen, dann gibt es HTML-Templating-Engines, die ähnlich wie vorbereitete Anweisungen in SQL funktionieren und Ihnen nicht erlauben, alles manuell zu umgehen, zum Beispiel PHPTAL .
Sie brauchen htmlentities () oder htmlspecialchars () nicht, wenn Sie Daten in die Datenbank einfügen. Es wird nichts Schlimmes passieren. Sie werden nicht anfällig für SQL-Injection sein, wenn Sie vorbereitete Anweisungen verwenden. Die gute Sache ist, dass Sie jetzt die ursprünglichen Benutzereingaben in Ihrer Datenbank speichern.
Sie MÜSSEN Dinge bei der Ausgabe flüchten und sie an einen Client zurücksenden. - Wenn Sie Dinge aus der Datenbank ziehen, sind Sie anfällig für Cross-Site-Scripting-Angriffe und andere schlimme Dinge. Sie müssen sie für das Ausgabeformat, das Sie benötigen, wie html, also müssen Sie immer noch htmlentities usw. entkommen.
Aus diesem Grund könnten Sie einfach Dinge entgehen, während Sie sie in die Datenbank einfügen, nicht wenn Sie sie ausgeben - Sie verlieren jedoch die ursprüngliche Formatierung des Benutzers, und Sie entziehen sich den Daten für die HTML-Verwendung, die möglicherweise nicht auszahlen, wenn Sie die Daten in verschiedenen Ausgabeformaten verwenden.
Vorbereitung für SQL Injection
htmlspecialchar für XSS (Weiterleitung an einen anderen Link)
Ausgabe : Dies ist ... und Weiterleitung an google.com
Verwenden Sie htmlspecialchars :
%Vor%Wenn die Benutzereingabe "das Skript" in die Datenbank kommentiert, wird der Browser angezeigt Alle Kommentare aus der Datenbank, Auto "das Skript" wird ausgeführt und Weiterleitung an google.com
Also,
1. Verwenden Sie htmlspecial für deactive Bad Script-Tag
2. Verwenden Sie prepare für sichere Datenbank
Ich wäre immer noch geneigt, HTML zu kodieren. Wenn Sie eine Form von CMS oder einer Webanwendung erstellen, ist es einfacher, sie als codiertes HTML zu speichern und dann nach Bedarf neu zu codieren.
Wenn Sie zum Beispiel Informationen in einen von TinyMCE modifizierten TextArea bringen, empfehlen sie, dass der HTML-Code codiert werden soll - da die HTML-Spezifikation HTML in einem Textbereich nicht erlaubt.
Ich würde auch strip_tags()
von überall wo du keinen HTML Code willst.