Der Martin: PHP vernünftig escapen?

Beitrag lesen

Hallo,

ich versuche gerade Benutzereingaben für ein mini-selfmade Forum vernünftig zu escapen.

für welchen konkreten Zweck? Ein Escaping, eine Maskierung oder Codierung verwendet man normalerweise, wenn man Daten von einem Kontext in einen anderen überführen will, z.B. PHP-String zu mySQL. Einfach "auf Verdacht" irgendwas escapen ist aber nicht sinnvoll, manchmal sogar nachteilig.

public function Escape($String) {

  $String = $this->Link->real_escape_string($String);  
  $String = nl2br(htmlentities($String),ENT_QUOTES);  
  return $String;  

}

  
Hier kombinierst du schon zwei Dinge, die sich widersprechen. Einerseits real\_escape\_string(), das einen String für den SQL-Kontext aufbereitet, und andererseits nl2br(), das eindeutig auf die Übergabe in HTML zugeschnitten ist.  
  
Daher nochmal die Frage: Was genau willst du an dieser Stelle erreichen?  
  

> EINS<br>  
> <br><br>  
> DREI  
> <p><br><br /><test>  
> FÜNF  
> <div></div><span><br>  
> LOL  
> ACHT  
>   
> Wenn real\_escape\_string drauf angewendet wird, sieht es so aus:  
>   
> EINS<br>  
> \r\n<br><br>  
> \r\nDREI  
> \r\n<p><br><br /><test>  
> \r\nFÜNF  
> \r\n<div></div><span><br>  
> \r\nLOL  
> \r\nACHT  
  
Die Darstellung sieht ungewohnt aus, weil man \r\n normalerweise am Ende der Zeile notiert, aber das ist wirklich nur eine Frage der Darstellung.  
  

> Und wenn htmlentities und nl2br drauf angewendet wird sieht es so aus:  
>   
> EINS&lt;br&gt;<br />\r\n&lt;br&gt;&lt;br&gt;<br />\r\nDREI<br />\r\n&lt;p&gt;&lt;br&gt;&lt;br /&gt;&lt;test&gt;<br />\r\nF&Uuml;NF<br />\r\n&lt;div&gt;&lt;/div&gt;&lt;span&gt;&lt;br&gt;<br />\r\nLOL<br />\r\nACHT  
  
Ja. Eine furchtbare Zeichenwurst.  
  

> 1. Wieso werden nicht alle Zeichen umgewandelt? zb. <br /> bleibt <br /> anstatt umgewandelt zu werden.  
  
Doch, es wird umgewandelt. <br />\r\n wird von htmlentities() zu &lt;br /&gt;\r\n gewandelt, und von nl2br() schließlich zu &lt;br /&gt;<br />\r\n. Es ist ein Trugschluss, dass nl2br() Zeilenumbrüche (\r) in <br> \_umwandelt\_, stattdessen fügt es nur ein <br /> hinzu und lässt den eigentlichen Zeilenumbruch noch stehen. Auf diese Weise entsteht auch im HTML-Quellcode ein Zeilenumbruch nach dem <br />.  
  

> 2. Die Sachen die encodet wurden zb. &lt;/div&gt; sind doch richtig encodet, sie müssten mir doch im Forum als <div> angezeigt werden, oder? Tun sie aber nicht. Sie stehen dort genau so wie hier.  
  
Dann machst du noch weitere Fehler, die aus dem gezeigten Code nicht hervorgehen. Beispielsweise einen weiteren Aufruf von htmlentities(), der die & noch zu &amp; konvertiert.  
  

> Was mache ich falsch?  
  
Wo fange ich an ...?  
  
Ciao,  
 Martin  

-- 
Lieber arm dran als Arm ab.  
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(