Frage

Ich bin sehr verwirrt über etwas und frage mich, ob jemand erklären könnte.

In PHP zu validieren i Benutzereingabe so htmlentitiies, mysql_real_escape_string vor dem Einsetzen in die Datenbank verwendet wird, nicht auf alles, wie ich reguläre Ausdrücke verwenden bevorzugen, wenn ich kann, obwohl ich sie hart arbeiten, mit finden. Jetzt offensichtlich werde ich mysql_real_escape_string verwenden, da die Daten in die Datenbank wird aber nicht sicher, sollte ich htmlentities werden () nur dann, wenn Daten aus der Datenbank erhalten und es auf einer Webseite, wie dabei vor der Hand die Anzeige verändert sich die von einer Person eingegebenen Daten die ist es nicht zu halten ist ursprüngliche Form, die Probleme verursachen können, wenn ich auf für für etwas anderes verwenden später, dass Daten verwendet werden soll.

So zum Beispiel, habe ich ein Gästebuch mit 3 Feldern Namen, Betreff und Nachricht. Jetzt offensichtlich die Felder können so etwas wie bösartiger Code in js Tags im Grunde nichts, jetzt enthalten, was mich verwirrt ist, lassen Sie sagen, ich bin eine böswillige Person, und ich beschloß, js-Tags und einigen malicous js Code und senden Sie das Formular verwenden, jetzt im Grunde ich habe böswillig nutzlose Daten in meiner Datenbank. Jetzt durch htmlentities bei der Ausgabe den schädlichen Code auf der Webseite (Gästebuch), das ist kein Problem, weil htmlentities umgewandelt hat es es sicher gleichwertig, aber dann in der gleichen Zeit habe ich nutzlos bösartigen Code in der Datenbank mit, dass ich lieber nicht haben.

Nach all dies meine Frage sagen will ist, sollte ich die Tatsache, dass einige Daten in der Datenbank möglicherweise bösartig, nutzlosen Daten akzeptieren und solange ich htmlentities auf alles ausgeben, verwenden ok oder sollte ich etwas anderes als gut tun ?.

Ich lese so viele Bücher über sagen Filtern von Daten auf sich zu empfangen und zu entkommen sie es auf der Ausgabe so die ursprüngliche Form gehalten wird, sondern sie immer nur Beispiele geben, wie ein Feld zu gewährleisten ist nur ein int Funktion bereits eingebaut in php etc, aber ich habe noch nie so etwas wie ein Gästebuch etwas in Bezug gefunden sicherzustellen, wo sich die Benutzer, was sie wollen geben, sondern auch, wie Sie diese Daten abgesehen von mysql_real_escape_string () Filter würde es nicht gewährleistet, die DB-Abfrage brechen?

Könnte jemand bitte endlich schließen diese Verwirrung für mich und mir sagen, was ich tun und was sollte am besten Praxis ist?

Danke an alle, die erklären können.

Cheers!

War es hilfreich?

Lösung

Dies ist eine lange Frage, aber ich denke, was Sie eigentlich fragen, läuft darauf hinaus:

„Soll ich entkommen HTML, bevor es in meine Datenbank einfügen, oder wenn ich es sehen?“

Die allgemein akzeptierte Antwort auf diese Frage ist, dass Sie die HTML entkommen sollte (über htmlspecialchars), wenn Sie gehen, um es dem Benutzer anzuzeigen, und nicht , bevor sie in die Datenbank setzen.

Der Grund ist dies: eine Datenbank speichert Daten. Was man in sie setzen, was der Benutzer eingegeben. Wenn Sie mysql_real_escape_string nennen, ändert es nicht das, was in die Datenbank eingefügt wird; es vermeidet lediglich die Eingabe als SQL-Anweisungen des Benutzers zu interpretieren. htmlspecialchars macht das Gleiche für HTML; Wenn Sie die Eingabe des Benutzers drucken, wird es vermeiden, dass es als HTML interpretiert. Wenn Sie Anruf htmlspecialchars vor dem Einsatz waren, sind Sie nicht mehr treu.

Sie sollten immer danach streben, die maximale-Fidelity-Darstellung haben Sie bekommen können. Da die Speicherung funktioniert die „bösartigen“ Code in der Datenbank keinen Schaden (in der Tat, es spart Ihnen etwas Platz, da flüchtete HTML länger als unescaped ist!), Und Sie könnten in Zukunft wollen , dass HTML ( was ist, wenn Sie einen XML-Parser auf Benutzer Kommentare verwenden, oder lassen Sie einen Tag haben vertrauenswürdige Benutzer in ihren Kommentaren eine Teilmenge von HTML, oder so?), warum es nicht sein lassen?

Sie fragen auch ein wenig über andere Arten von Eingabevalidierung (integer Einschränkungen, etc). Ihr Datenbank-Schema sollte diese durchzusetzen, und sie können auch auf der Anwendungsschicht (vorzugsweise auf Eingabe über JS und dann wieder Server-Seite).

überprüft werden

Auf einer anderen Anmerkung, die beste Art und Weise Datenbank mit PHP entkommen zu tun ist wahrscheinlich PDO zu verwenden, anstatt mysql_real_escape_string direkt aufrufen. PDO hat erweiterte Funktionen, einschließlich der Typprüfung.

Andere Tipps

mysql_real_escape_string() ist alles, was Sie für die Datenbankoperationen benötigen. Es wird dafür sorgen, dass ein böswilliger Benutzer nicht etwas in Daten einbetten das wird „break“ Ihre Fragen.

htmlentities() und htmlspecialchars() ins Spiel kommen, wenn Sie arbeiten Sachen an den Client / Browser sendet. Wenn Sie potentiell feindlichen HTML bereinigen möchten, würden Sie besser dran mit HTMLPurifier , die die Daten-Streifen das Fundament und der Schlauch mit Bleiche nach unten und wieder aufzubauen es richtig.

Es gibt keinen Grund zur Sorge in der Datenbank böswilligen JavaScript-Code zu haben, wenn Sie die HTML sind entkommen, wenn es herauskommt. So stellen Sie sicher, dass Sie immer tun Flucht alles, was von der DB kommt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top