BBcode güvenle ayrıştırmak nasıl?

3 Cevap php

Ben php forum kodlarını ayrıştırmak çalışıyorum ama benim kod hiç güvenli olduğunu sanmıyorum.

$Text = preg_replace("(\[color=(.+?)\](.+?)\[\/color\])is","<span style=\"color: $1\">$2</span>",$Text); 

Ben böyle bir enjeksiyon geçebilir düşünüyorum ve bu iş olacak:

[color=<script>alert('gotcha');</script>]...[/color]

Nasıl sadece iki standar renk biçimlerini yakalamak benim regex geliştirmek için:

[color=red]...[/color] OR [color=#FF0000]...[/color]

Teşekkürler

3 Cevap

PHP aslında built-in support for bbcode (bir PECL eklentisini yüklemeniz gerekir olsa) vardır.

Alternatif olarak, bir PEAR library HTML_BBCodeParser Bu kullanabileceğiniz var.

Ben bunun yerine topluluk sınanmıştır gibi kendi yazma yukarıdaki çözümlerden birini kullanarak öneriyoruz.

(\[color=((([a-zA-Z])+)|(\#[A-F0-9]{1,6})))

Ben benim regex (üzgünüm) biraz paslı, fikir düşünüyorum.

Kendi bbcode ayrıştırıcı yazmak istiyorum eğer, bunun için iyi bir Recursive descent parser yazmak için biraz zaman almak en iyisidir.

Bu, kod rastgele bir olan, bbcode düzgün biçimlendirilmiş ve iç içe olduğundan emin olmalıdır, çünkü düzenini bozabilir. Siz bağlantıları herhangi bir javascript :/ / protokolü tanıtıcılarınızı kaldırmak için dikkat etmelisiniz. Ve sadece almak almak çift kodlama ([[b] kalın b bana [/ b]] ben de [/ b]) önlemek için bir kez dize üzerine gitmek. Liste uzayıp gidiyor ve tamamen doğru almak için basit regexes dışındadır.