php - 是否有可靠的 PHP 无依赖性 BB 代码解析器?

标签 php bbcode

<分区>

我遇到过客户端使用 php4 但看起来不像他们有 PEAR 的情况。是否有一个已建立的 PHP BBCode 解析器可以与 vBulletin 的 BBCode 系统一起工作?

我只需要将 BBCode 转换为 HTML。这是从vBulletin 到新平台的数据迁移,所以我不能使用vBulletin 的BBCode 解析器。

文档:

http://www.vbulletin.com/forum/misc.php?do=bbcode

最佳答案

‘坚固’?我从来没有找到一个可靠的 BBcode 解析器。它们似乎都是粗心的正则表达式的松散集合,很容易被愚弄以允许 HTML 注入(inject)攻击。

例如,John W 发布的那篇文章显然可以通过多个标签加以利用,包括:

[img]xxx" onerror="alert('JS injection!')[/img]

加上它允许 javascript:和其他危险网址,无法转义& , 不允许许多 URL 字符(包括 % !),同时不小心允许其他不应该的字符(作者还不太明白字符串中的反斜杠转义符在那里做什么)并且它无法禁止错误嵌套的标签或意外标签吸收了其他标签的属性...基本上这是一个不安全的困惑,这与 bbcode 解析器的类(class)相同。

对于没有帮助的回答感到抱歉(它太大而无法放在评论中)。

ETA 回复评论:嗯,它不完全是一个 bbcode 模块,只是相似。我按行拆分,删​​除了现有的控制字符,然后使用字节 01 作为 & 的代理项, 02 表示 < 03 表示 > ,然后对于每个转换步骤,在 (\x02[^\x03]*\x03) 上使用 re.split并在每一秒(非标签)部分运行替换正则表达式,从换行符和表情符号等“最内层”替换开始,然后通过图像向外工作到链接和斜体/粗体标记,插入 \x02html tags\x03顺其自然。然后最后 HTML 编码 &<>并将控制代码替换为 &<> .这会阻止标记本身被标记,这是简单的基于正则表达式的标记中漏洞的一大来源。

回想起来,我确实也编写了一个实际的 Python bbcode 解析器,但只是作为一个快速的兼容性 hack;它不提供完整 bbcode 的所有功能。特别是,它不允许在任何其他范围标签内嵌套任何范围标签(即带有关闭标签的标签)。如果可以接受,这实现起来相对容易,因为您可以使用单次正则表达式来匹配任何标签,并让替换函数根据标签名称决定如何替换。例如:

\[ (i|b|color|url|somethingelse) \=? ([^]]+)? \] (?: ([^]]*) \[\/\1\] )

(这是一个 VERBOSE 正则表达式,所以空格只是为了便于阅读。就像任何正则表达式一样可读。)

去除嵌套极大地简化了极端情况的数量。

关于php - 是否有可靠的 PHP 无依赖性 BB 代码解析器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1799454/

相关文章:

html - PHPBB 最佳 YouTube BBCode

android - Xamarin Forms 跨平台 BBCode 支持

php - 使用 google Analytics reporting api v4 时出错

php - 如何从 Facebook ID 获取用户名

php - 为什么 laravel View 显示空白页?

javascript - 使用 Javascript 的文本区域切换选择标签

php - MySql Processlist 填充了 "Sleep"导致 "Too many Connections"的条目?

php - 基于多列对 MySql 进行排序

javascript - 在 Javascript 中解析 BBCode

python - 删除Python中嵌套的bbcode引号?