PHP regex Pattern läuft nicht wie erwartet

Achso, dann suche ich dazu nochmal weiter. Danke dir vielmals auch für die gute Hilfe. Ich markiere als gelöst und wünsche einen schönen Tag.
@ComFreek zum Thema Sicherheit bearbeite ich noch nochmal den ersten Post.
 
Wenn du da einen Vorschlag hast greife ich den auch gerne auf!
Sich einen richtigen Parser selbst zu schreiben, ist nicht so einfach. Vielleichst hast du Glück und es gibt einen fertigen PHP BB-Code Parser als Paket irgendwo online. Falls nicht, würde ich als nächstes auf einen Parsergenerator setzen, wo du eine EBNF Grammatik eingibst, und einen Parser zurückbekommst.

Das Muster von BB-Codes ist tatsächlich nicht so einfach. Gut sehen kann man das daran, dass dein Parser übrigens keine Boxtitel mit Double Quotes oder schließenden eckigen Klammern erlaubt.

Nach der Codeeingabe wird alles durch den HTMLPurifier geschickt bevor es in die Datenbank geschrieben wird.
Der schlussendliche Datenfluss ist also: Nutzereingabe --> HTMLPurifier --> "BB-to-HTML-Compiler" von dir.

Code:
<!-- CSS Injection -->
[BOX title="..." width="50%;display:none"]...[/BOX]

<!-- Angenommen, du würdest Attribute mit Single Quotes zulassen, so hättest du nun XSS -->
[BOX title="..." width='50%" onclick="alert(1)"']...[/BOX]

Es gibt sicher noch viele weitere Varianten zum Exploiten des Codes. Hier findest du unzählige Anreize: XSS Filter Evasion Cheat Sheet | OWASP.

Es wäre möglicherweise besser, den Datenfluss auf Folgendes abzuändern: Nutzereingabe --> "BB-to-HTML-Compiler" von dir --> HTMLPurifier

Das hätte den Nachteil, dass man nun auch HTML eingeben kann und dieses auch verwertet wird (sofern HTMLPurifier es durchlässt). Auf der anderen Seite kannst du sehr sicher sein, dass das, was am Ende herauskommt, auch sicher* ist, denn HTMLPurifier ist die letzte Instanz.

*) so sicher wie HTMLPurifier eben
 
Ja, ok, das ist nachvollziehbar.
Um die Attribute mache ich mir aber weniger Sorgen (abgesehen von den Double Quotes, die Berücksichtigung fehlt tatsächlich, das rüste ich nach!). Die Attribute sind aber sehr strikt gehalten. Nur ausgewählte Attribute werden ausgewertet, alles andere wird verworfen. Ebenso wird der Inhalt des Attributes nochmal geprüft ob dieser auch zu dem Feld passt. Damit möchte ich zum einen die von dir genannten Beispiele verhindern und zum anderen Anzeigefehler durch Fehleingaben verringern.

Hier mal ein Beispiel aus meiner Attributauswertung:
PHP:
if(isset($attributes['corner']) && is_numeric($attributes['corner'])){
    $style_main_box .= " border-radius: ".$attributes['corner']."px;";
}
Bei der width sind z.B. auch nur Werte zulässig die %, px, em am Ende haben und der vorangehende Wert muss in float geparsed werden können.

Ich hatte auch noch daran gedacht geschlossene Tags für die keine offene bestehen auszusieben aber das übernimmt der Purifier für mich, wie ich feststellen habe :)

Den HTMLPurifier werde ich dann Sicherheitshalber bei der Ausgabe ausführen.
Damit sollte ich dann wirklich alles notwendige getan haben. Was die Sicherheit angeht zumindest.
 
Zurück