Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Kommentarfunktion, welche Zeichen maskieren (Sicherheitsaspekte) [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Kommentarfunktion, welche Zeichen maskieren (Sicherheitsaspekte)


 
Laire
15-03-2009, 23:40 
 
Hallo,

Ich möchte gerne eine Kommentarfunktion auf einer Seite Implementieren. Das Kommentar wird dann in einer MySQL Tabelle gespeichert.

Jetzt überlege ich, welche Zeichen ich "maskieren" sollte um keine Sicherheitslücke zu bieten.

An sich müsste es doch reichen die < und > auszutauschen oder?

 
wahsaga
15-03-2009, 23:52 
 
htmlspecialchars, und gut.

 
fireweasel
17-03-2009, 15:40 
 
Original geschrieben von Laire
[B]Hallo,

Ich möchte gerne eine Kommentarfunktion auf einer Seite Implementieren. Das Kommentar wird dann in einer MySQL Tabelle gespeichert.

Jetzt überlege ich, welche Zeichen ich "maskieren" sollte um keine Sicherheitslücke zu bieten.

Gar keine -- benutze die datenbankspezifische "Escape"-Funktion. In deinem Fall höchstwahrscheinlich mysql_real_escape_string() (http://php.net/manual/en/function.mysql-real-escape-string.php). Besser ist natürlich das Verwenden eines MySQL-Treibers, der parametrisierte Queries unterstützt und dir das "Escapen" abnimmt.

An sich müsste es doch reichen die < und > auszutauschen oder?
Um diese Zeichen musst du dir erst Gedanken machen, wenn du die Inhalte deiner Datensätze an den Browser schickst. Zusätzlich zu '<' und '>' solltest du dann mindestens noch '&' maskieren, denn das wird benötigt, um '<' und '>' in '&lt;' und '&gt;' umzuwandeln. Die "Quote"-Zeichen '"' und ''' zu maskieren, ist auch keine schlechte Idee. Das alles kann das schon erwähnte htmlspecialchars() (http://php.net/manual/en/function.htmlspecialchars.php).

Wichtig: ALLE auszugebenden Texte[1] müssen entsprechend maskiert werden (und nicht nur der Kommentartext, den du aus der <texarea> geklaubt hast). Ermöglichst du bspw. deinen Kommentatoren einen "Homepage-Link" (oder sonst irgendeine(n) URL) anzugeben, dann musst du auch diese vor der Ausgabe mit htmlspecialchars() behandeln:


// ...
echo 'Homepage: ',
echo '<a href="', htmlspecialchars($url), '">', htmspecialchars($url), '</a>';
// ...


Und wo wir gerade bei Links sind: <a href="javascript: ..."> ist sicher auch nichts, was du dir von Wildfremden auf deine Web-Seiten schreiben lassen willst. ;)
Hier hilft dir htmlspecialchars() nicht weiter, da musst du selbst ran und unzulässige Eingaben ausfiltern.

--
[1] Wenn sie nicht gerade selbst HTML darstellen sollen ...

 
rossixx
23-03-2009, 10:37 
 
Hier hilft dir htmlspecialchars() nicht weiter, da musst du selbst ran und unzulässige Eingaben ausfiltern.

<a href="java script: ...">



Hat das was mit Cross-Site-Scripting zu tun?

Wie könnte man das filtern ???

 
Kropff
23-03-2009, 11:57 
 
für so was gibt es scripte, wie zum beispiel safehtml (http://drupal.org/project/safehtml). damit kann man mögliche xss-attacken abwehren.

peter

 
fireweasel
23-03-2009, 21:35 
 
Original geschrieben von rossixx
...

Hier hilft dir htmlspecialchars() nicht weiter, da musst du selbst ran und unzulässige Eingaben ausfiltern.

<a href="javascript: ...">


Interessant: Dass hier "java script" statt des von mir eingegebenen "javascript" steht, sagt mir, dass diese Boardsoftware auf krude Art versucht, genau dieses Problem zu entschärfen. ;)

Hat das was mit Cross-Site-Scripting zu tun?
Möglich. Aber ich würde hier eher von Code-Injection sprechen, weil der Script-Code ja direkt von deiner Site aus ausgeführt wird. Cross-Site-Scripting steht für Scripts, die von fremden Servern im Kontext deiner Site ausgeführt werden können.

Wie könnte man das filtern ???
Indem du nur dir genehme Daten durchlässt und alle anderen abweist. Für den speziellen Fall:


// User-Eingaben prüfen
// für "Homepage-Link"
if (!preg_match('/\Ahttp:\/\//', $input_url))) {
// Fehlermeldung und Formular nochmal neu anzeigen
// ...
}

Es kann auch nützlich sein, hier zu prüfen, ob $input_url ueberhaupt eine gültige URL darstellt. PHP > 5.2 hat für sowas die Filter-Erweiterung (http://de2.php.net/manual/en/book.filter.php).


//...
// Ausgabe
echo '<a href="', htmlspecialchars($input_url), '">', htmlspecialchars($input_url), '</a>';

 
pascal007
25-03-2009, 12:03 
 
also ich benutzer einfach immer:

mysql_real_escape_string(strip_tags($variabel))

reicht das nicht?

 
PHP-Desaster
25-03-2009, 12:04 
 
Warum strip_tags? Ich will doch HTML in meinem CMS verwenden können...
Eingabe: escape-Methode der Datenbank verwenden oder einfach PDO mit PreparedStatement.
Ausgabe: htmlspecialchars


Alle Zeitangaben in WEZ +2. Es ist jetzt 08:24 Uhr.