• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Ab wann ist ein vom Besucher geschriebner Text wirklich sicher?

xXxPeterPanxXx

Neues Mitglied
Hallo Leute,

bis jetzt schicke ich Texte, die vom User geschrieben sind und in die Datenbank sollen, nur einmal durch die Funktion htmlspecialchars() und durch wordwrap(), aber reicht das schon aus? Oder gibt es noch Sicherheitslücken, die ein User ausnutzen kann? Immerhin möchte eine sicher Website haben, keiner soll Zugriff auf die Datenbank oder den Webspace bekommen?

Also reicht htmlspecialchars() schon aus?

Gruß xXxPeterPanxXx
 
Werbung:
htmlspecialchars() ist nur für die Ausgabe wichtig. Für das Einfügen in die Datenbank musst du (sofern MySQL) mysql_real_escape_string() benutzen.
 
Werbung:
Aber mysql_real_escape_string() verwendet man doch erst nach dem man die Daten aus der Datenbank holt, dass kann aber schon zu spät sein.
Ich habe mysqli_real_escape_string bisher immer vor dem Einfügen in die Datenbank gesehen. (Zugegeben, habe noch nicht besonders viele Scripte gesehen.)

htmlspeacialchars() oder htmlentities() nutze ich beim auslesen.
 
Ja. In aller Regel mysql_real_escape_string (und Konsorten), um die SQL-Statements vor SQL-Injections zu sichern, und bei Ausgabe htmlspecialchars oder (wenn es sein muss) htmlentities, um die HTML-Ausgabe vor JavaScript-XSS zu schützen.

Du hast das anscheinend genau vertauscht, PeterPan. Im Zweifel noch mal in der Anleitung lesen, was die Befehle genau bewirken.
 
htmlentities reicht beim eintragen völlig aus. Man muss nur einen zweiten parameter mitgeben:
htmlentities($string, ENT_QUOTES);
 
Werbung:
Das mag stimmen, muss aber nicht. Die Funktion für diesen Zweck einzusetzen, ist definitiv nicht korrekt. Siehe crash und vitus37 und mein letzter Post.

Edit: Falls den Thread hier später noch jemand liest. Siehe Beitrag #26.
 
Zuletzt bearbeitet:
Ich fürchte, das ist nicht ganz leicht zu erklären. Unabhängig davon ist ein Gegenargument, dass du mit htmlentities gezwungen bist, allen Text mit HTML-Entities ("&lt;" statt "<" usw.) in der Datenbank stehen zu haben, was sicher in manchen Fällen problematisch ist. In der Datenbank sollten nach Möglichkeit die Originaldaten stehen, da nur so Flexibilität hinsichtlich des Ausgabeformats gewährleistet ist.

Ansonsten lies mal diesen Blogeintrag: Chris Shiflett: addslashes() Versus mysql_real_escape_string()

Was hier über verschiedene Charsets für addslashes gezeigt wird, könnte auch für htmlentities gelten. (Ich weiß es ehrlich nicht.) Für mysql_real_escape_string gilt es nicht, da diese Funktion eine Datenbankverbindung voraussetzt und deshalb auch das korrekte Charset kennt und umsetzen kann.

Zudem heißt es im Handbuch:

mysql_real_escape_string() calls MySQL's library function mysql_real_escape_string, which prepends backslashes to the following characters: \x00, \n, \r, \, ', " and \x1a.

Ich weiß auch hier nicht, ob htmlentities etwas Vergleichbares mit den entsprechenden Zeichen anstellt bzw. ob sich mögliche Angriffspunkte ergeben, wenn htmlentities das nicht tut.

Es könnte sein, dass all das (zufällig oder nicht) niemals zu Problemen führen wird, aber es könnte auch nicht sein.

Was ich aber definitiv sagen kann: htmlentities ist nicht dafür gedacht, Werte für Datenbankabfragen zu escapen. Die Funktion ist dafür gedacht, Werte für die Ausgabe als HTML aufzubereiten.

Das mag keine besonders tolle Begründung sein, aber du benutzt schließlich auch nicht... sagen wir... base64encode, um Werte für SQL-Queries aufzubereiten. Das wäre prinzipiell dasselbe wie htmlentities.

Edit: Noch einmal anders gesagt: Wenn htmlentities ausreicht, um den Job von mysql_real_escape_string zu erfüllen, ist das nicht mehr als Zufall. Diese Funktion ist definitiv nicht dazu vorgesehen.
 
Zuletzt bearbeitet:
Werbung:
Ich fürchte, das ist nicht ganz leicht zu erklären. Unabhängig davon ist ein Gegenargument, dass du mit htmlentities gezwungen bist, allen Text mit HTML-Entities ("&lt;" statt "<" usw.) in der Datenbank stehen zu haben, was sicher in manchen Fällen problematisch ist. In der Datenbank sollten nach Möglichkeit die Originaldaten stehen, da nur so Flexibilität hinsichtlich des Ausgabeformats gewährleistet ist.

wieso dann nicht zweimal in der Datenbank speichern ? einmal htmltext und einmal nur text.
 
Werbung:
ist es nicht doch irgendwie sinnvoller htmlentitiers() / htmlspeacialchars() vor dem Einfügen in die Tabelle einzusetzen. Sonst müssten die Funktionen bei zB einem Forum beim Auslesen nocheinmal angewandt werden, was eine längere Ladezeit zur Folge hat. D.h. nicht lieber einmal die Funktion nutzen anstatt bei jedem Seitenaufruf?

In Anbetracht dessen finde ich den Vorschlag von Loon3y garnicht so schlecht, da man ja nur eine Tabelle von den beiden nutzen muss, und bei dieser die Funktion dann bereits zum Einsatz kam. Auf der anderen Seite hat man volle Variabilität durch die Originaleingaben der anderen Tabelle.

ODER? :)
 
In Anbetracht dessen finde ich den Vorschlag von Loon3y garnicht so schlecht, da man ja nur eine Tabelle von den beiden nutzen muss, und bei dieser die Funktion dann bereits zum Einsatz kam. Auf der anderen Seite hat man volle Variabilität durch die Originaleingaben der anderen Tabelle.

ODER? :)

Gar nicht wird gar nicht zusammen geschrieben ;)

Und wofür ist dann die andere Tabelle wenn man nur eine davon benutzt?
 
ist es nicht doch irgendwie sinnvoller htmlentitiers() / htmlspeacialchars() vor dem Einfügen in die Tabelle einzusetzen. Sonst müssten die Funktionen bei zB einem Forum beim Auslesen nocheinmal angewandt werden, was eine längere Ladezeit zur Folge hat. D.h. nicht lieber einmal die Funktion nutzen anstatt bei jedem Seitenaufruf?

In Anbetracht dessen finde ich den Vorschlag von Loon3y garnicht so schlecht, da man ja nur eine Tabelle von den beiden nutzen muss, und bei dieser die Funktion dann bereits zum Einsatz kam. Auf der anderen Seite hat man volle Variabilität durch die Originaleingaben der anderen Tabelle.

ODER? :)

Genau das denke ich auch.
 
Werbung:
Ups, danke für den Hinweis und die Eselsbrücke :)Gute Frage. Wohl für die Variabilität im Umgang mit den Werten in der Tabelle, obwohl man diese nicht braucht, wenn man auf diese Variabilität verzichten kann.

Hmm ich versteh die Variante nicht :S kann sein, dass ich gerade aufem Schlauch stehe.

Aber nochmal zum Thema. Reicht es wenn man "mysql_real_escape_string" bei der eingabe in die Datenbank verwendet und htmlentities bei der Ausgabe?
 
Ich finde es immer blöd htmlspecialchars() bei jeder Ausgabe zu benutzen, darum verwende ich erst htmlspecialchars(), dann mysql_real_escape_string und danach geht es ab in die Datenbank.
 
Werbung:
ber nochmal zum Thema. Reicht es wenn man "mysql_real_escape_string" bei der eingabe in die Datenbank verwendet und htmlentities bei der Ausgabe?
So wie ich das aus dieser Diskussion entnommen habe: Ja, das reicht, wobei man anstatt htmlentities htmlspecialchars nutzen sollte. Begründung by mermshaus.

Die Idee hinter den zwei Tabellen:
in einer wurden bereits alle Umlaute mit htmlentities / htmlspecialchars umgewandelt und in der anderen nicht.
beim normalen Auslesen von Daten aus der Datenbank greift man dann auf die Tabelle zu, in der die Umlaute bereits ersetzt wurden. Dadurch wird die Seite schneller geladen, da die Funktion nicht nocheinmal angewandt werden muss.

in der zweiten Tabelle stehen die Originalwerte, also die nicht umgewandelte Eingabe. Das soll eine Variabilität ermöglichen (kann mir aber selbst nicht viel drunter vorstellen)
 
Zurück
Oben