Sers,
ich versuche gerade Benutzereingaben für ein mini-selfmade Forum vernünftig zu escapen. Zum testen hab ich mal eine simple Funktion gebaut:
public function Escape($String) {
$String = $this->Link->real_escape_string($String);
$String = nl2br(htmlentities($String),ENT_QUOTES);
return $String;
}
$this->Link ist die mysqli-Instanz. Zur Erklärung: htmlentities encoded ja wirklich alle Entities, die es so gibt. real_escape_string encoded laut wiki NUL (ASCII 0), \n, \r, , ', ", and Control-Z und daher muss ich es benutzen, weil das nicht alles von htmlentities() abgedeckt wird. Jetzt habe ich folgendes Problem:
Ich gebe zum testen irgendeinen Schwachsinn ein.
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
Und wenn htmlentities und nl2br drauf angewendet wird sieht es so aus:
EINS<br><br />\r\n<br><br><br />\r\nDREI<br />\r\n<p><br><br /><test><br />\r\nFÜNF<br />\r\n<div></div><span><br><br />\r\nLOL<br />\r\nACHT
Jetzt frage ich mich:
1. Wieso werden nicht alle Zeichen umgewandelt? zb. <br /> bleibt <br /> anstatt umgewandelt zu werden.
2. Die Sachen die encodet wurden zb. </div> 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.
Was mache ich falsch?