phpBB.de - Die deutsche phpBB-Community
Stand: 30.12.2008 04:56
aktuelle Version auf phpBB.de
 
Apache At Work Communities Community Building Informationen und Hinweise Installation/Konfiguration/Update MySQL PHP phpBB-Optimierungen phpBB3 Rechtliches Server & Technik Snippets Templates und Mods
 



Knowledge Base Offline -> At Work -> Welchen Sinn hat die bbcode_uid?

Welchen Sinn hat die bbcode_uid?
Autor: Pyramide
Stand: 30.12.2008 04:56
Neuste Version unter: http://www.phpbb.de/doku/kb/bbcode_uid

Welchen Sinn hat die bbcode_uid?

Der Artikel beschreibt, warum phpBB Beiträgen mit BBCode ein Feld bbcode_uid einfügt und dessen Inhalt in die BBCode-Tags mit einmischt.
phpBB 2.x wandelt den BBCode nicht mehr wie 1.x beim Abspeichern direkt in HTML-Code um, sondern erst in eine Zwischenversion, welche zusätzlich einen seltsamen Code enthält, den sogenannten bbcode_uid (BBCode unique identifier). Dieser besteht aus 6 Buchstaben und/oder Ziffern.

Warum überhaupt ein Zwischenschritt? Da seit phpBB 2.x der HTML-Code der BBCodes Template-spezifisch ist (bbcode.tpl im Template-Verzeichnis), kann die entgültige Umwandlung erst beim Anzeigen des Beitrages vorgenommen werden (der Autor des Beitrages könnte ja ein anderes Template ausgewählt haben als derjenige, der ihn liest). Der Zwischenschritt hat den Sinn, daß trotzdem ein Großteil der Zeitaufwendigen Prüfungen bereits beim Abspeichern des Beitrages (und somit nur einmal) durchgeführt werden müssen.

Das ganze basiert im Wesentlichen darauf, daß zwei verschiedene Ersetzungsfunktionen verwendet werden: preg_replace und str_replace.
  • preg_replace ist eine komplexe Funktion, welche mittels Regulärer Ausdrücke z.B. die Möglichkeit bietet, ein [starttag] und ein [/endtag] mit beliebig definierbarem Text dazwischen einander zugeordnet werden können. Dies ist auch nötig, damit böswillige Benutzer beispielsweise nicht durch einen Beitrag, der nur aus dem Tag [b] besteht, bewirken, daß der komplette Rest der Seite Fett dargestellt wird.
  • str_replace hingegen kann lediglich einen festen Text durch einen anderen festen Text ersetzen, ist dafür jedoch um ein vielfaches schneller als preg_replace.

Beim phpBB werden diese beiden Funktionen nun folgendermaßen kombiniert: Beim Abspeichern wird zuerst der Beitragstext mit preg_replace geparst, um zusammengehörige Start-/Endtags zu erkennen. Ersetzt wird jedoch nicht durch HTML-Code, sondern durch die gleichen BBCode-Tags mit der bbcode_uid. Beispiel: [x]Hallo[/x] -> [x:abc123]Hallo[/x:abc123]. Somit werden die "nicht böswilligen" BBCodes gekennzeichnet, um diese dann beim Anzeigen der Funktion str_replace übergeben zu können, welche performanceschonend alle Vorkommen von [x:abc123] durch <x> sowie [/x:abc123] durch </x> ersetzen kann. Und nun um zu verhindern, daß jemand diesen Schutz umgeht, indem er direkt [x:abc123] schreibt, wird die bbcode_uid bei jedem neuen/bearbeiteten Beitrag zufällig erstellt und mit in der Datenbank abgespeichert.



Knowledge Base Offline -> At Work -> Welchen Sinn hat die bbcode_uid?