dedlfix: Kontext-gerechtes Verarbeiten von user-submitted data

Beitrag lesen

Hi!

<?

if (isset($_POST['neu'])) {
$text = trim(htmlentities(strip_tags($_POST['text'])));
}

  
Du willst isset($\_POST['text']) prüfen, aber das ist vermutlich nur ein Unaufmerksamkeitsfehler.  
  

> und dann  
>   
> `mysql_query("INSERT tv (text) VALUES ('$text')");`{:.language-php}  
  
Nicht alles auf einmal. Was willst du mit der HTML-spezifischen Notation im DBMS? Das ist kein HTML-Kontext. Das stört dort nur bei Vergleichen und anderen Formen der Stringverarbeitung. Der HTML-Kontext kommt irgendwann später, wenn überhaupt. Dann erst ist es angebracht sich um ihn zu kümmern.  
  
Das wichtigste hast du aber vergessen: Du hast hier ein SQL-Statement und willst $text in einen SQL-String-Kontext einfügen. Weder trim() noch htmlentities() noch strip\_tags() haben sich um eventuell enthaltene ' gekümmert. Wenn solche in $text enthalten sind, bekommst du Syntaxfehler oder andere schlimme Krankheiten.  
  

> Wenn ich das absende und von mir aus Test <html> ins Textfeld eingebe, landet Test <html> auch in der Datenbank.  
  
Durch dein strip\_tags() landet nur Test in der Datenbank. htmlentities() macht in dem konkreten Fall nichts. Aber beispielsweise Umlaute, & und " werden dir verunstaltet (im Datenbanksinne).  
  

> Müsste das durch diese Geschichte  
> `$text = trim(htmlentities(strip_tags($_POST['text'])));`{:.language-php}  
> nicht ausgeschlossen sein oder habe ich offensichtlich etwas falsch gemacht?  
  
Was bringt dir strip\_tags()? Wenn du bei der Ausgabe in den HTML-Kontext htmlspecialchars() korrekt anwendest, dann kann dir egal sein, ob jemand HTML-Code oder was anderes, ähnlich aussehendes geschrieben hat. Es landet nicht als ausführbarer Code in der Ausgabe.  
  
Selbst wenn du keinen HTML-Code in deiner Anwendung angezeigt haben möchtest, wirst du unter Umständen den Rest des Textes auch nicht haben wollen. Außerdem finden sich weitere Wege, unsinniges Zeug zu übergeben, ohne dass da irgend eine Form von Code dabei ist. strip\_tags() entbindet dich nicht von deinen "Kontrollpflichten" gegenüber unerwünschten Eingaben.  
  
  
Lo!