dedlfix: POST und UTF8 -> Sonderzeichen

Beitrag lesen

Hi!

Den der Filter soll eigentlich XSS unmöglich machen:

function filter($data) {

$data = trim(htmlentities(strip_tags($data)));

if (get_magic_quotes_gpc())
$data = stripslashes($data);

$data = mysql_real_escape_string($data);

return $data;
}

  
Du versuchst, alles auf einmal zu erledigen: Eingabedatenbehandlung plus Ausgabedatenbehandlung für zwei verschiedene Medien und beachtest dabei nicht einmal die Zeichenkodierung und die Funktionsparameter, die dafür zuständig sind. Das ist alles ungünstig. Lies bitte den Artikel zum [Kontextwechsel](http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel) und achte bitte in Zukunft genau darauf, wann welche Daten in welchen Kontext übergehen und behandle sie erst dann und nur genau dafür (siehe Abschnitt [HTML in der Datenbank](http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel/erkennen_und_behandeln#HTML_in_der_Datenbank)).  
  
Außerdem solltest du die Reihenfolge der verschiedenen Schritte beachten, durch die die Daten bereits gegangen sind. PHP fügt als Letztes die Magic Quotes hinzu (falls man dieses Feature immer noch aktiviert hat), also sollte man auch zuerst die Magic Quotes wieder entfernen. Das hat zwar möglicherweise keine Auswirkungen, wenn sich die Funktionen aufgrund der von ihnen behandelten verschiedenen Zeichen nicht in die Quere kommen, aber zumindest sieht es undurchdacht aus. Es ist jedenfalls einfacher, die Reihenfolge einzuhalten, als sich davon zu überzeugen, dass alle Kombinationen von Zeichen und Funktionen in einer anderen Reihenfolge problemlos zusammenarbeiten.  
  
Jedenfalls hast du nach der M.Q.-Entfernung die Daten so vorliegen, wie sie eingegeben wurden. Die zum Transport vom Browser hinzugefügte URL- oder Prozent-Kodierung wird von PHP selbständig entfernt (bevor es eventuelle M.Q. hinzufügt).  
  

> Und nach dem Filter passiert das ÖÄÜ Problem. Gibt es da vielleicht einen Trick, wie man die Sonderzeichen rettet?  
  
Damit zeigt sich, das Cheatah nicht richtig geraten hat. Warum das passiert, hat dir Der Martin schon erzählt. Abgesehen davon käme htmlentities() mit UTF-8-kodierten Zeichen klar, wenn du den entsprechenden Funktionsparameter richtig versorgt hättest, aber diese Funktion ist normalerweise (also, wenn man konsequent mit UTF-8 arbeitet) unnötig, selbst wenn sie für den Kontext HTML verwendet wird. Nicht unnötig ist hingegen ihre "kleine Schwester" htmlspecialchars(), denn die kümmert sich lediglich um die HTML-eigenen Zeichen. Für alle anderen bist du mit UTF-8 bereits bestens bedient.  
  

> > > Ich habe daher vor dem Eintrag in die Datenbank einen ECHO Befehl gesetzt und auch hier wird aus ä ein ä.  
> > das ist ein UTF-Zeichen, welches in ISO-Kodierung dargestellt wird.  
  
Richtig formuliert wäre eher, dass die UTF-8-Bytefolge des ä gemäß der ISO-8859-1-Kodierung interpretiert wurde (nicht nur "ISO", denn es gibt eine Menge ISO-Standards). Für eine Darstellung ist keine Kodierung sondern eine Glyphe zuständig.  
  
Für die Kommunikation mit MySQL ist noch ein wenig mehr zu beachten: SELFHTML-Wiki [Themen:Zeichencodierung/MySQL](http://wiki.selfhtml.org/wiki/Themen:Zeichencodierung/MySQL). Auch der Rest zum Thema [Zeichenkodierung](http://wiki.selfhtml.org/wiki/Themen:Zeichencodierung) kann nicht schaden.  
  
  
Lo!