Hallo dedlfix,
Hier fehlt nur als zweiter Parameter von htmlspecialchars() ein ENT_QUOTES, wegen der Verwendung von ' als Stringbegrenzer im JavaScript. Ansonsten muss der onclick-Inhalt gemäß HTML behandelt werden. Die für PHP und JavaScript kritischen Zeichen ', " und \ sind ja abgedeckt. Oder hab ich noch was übersehen?
Wenn Du ' als die Escape-Sequenz für ' nimmst (also *nur* ent_quotes), dann kommt das trotzdem als Anführungszeichen im Javascript-Interpreter an - was dann zu XSS führt.
Probier's aus, stell Dir vor, $usereingabe wäre so definiert:
$usereingabe = "'); alert ('foobar";
echo "<span onclick=\"tuwas ('".htmlspecialchars ($usereingabe, ENT_QUOTES)."');\">"
Gibt:
<span onclick="tuwas (''); alert ('foobar');">
Und der Javascript-Interpreter sieht das:
tuwas (''); alert ('foobar');
Denk Dir nun statt alert ('foobar') irgend einen bösen Code dahin und dann hast Du den XSS-Salat.
Sprich: Du musst das erst als Javascript-String maskieren und *dann* erst als HTML-String maskieren.
Viele Grüße,
Christian
Mein "Weblog" [RSS]
Using XSLT to create JSON output (Saxon-B 9.0 for Java)
»I don't believe you can call yourself a web developer until you've built an app that uses hyperlinks for deletion and have all your data deleted by a search bot.«
-- Kommentar bei TDWTF