2

我遇到了客户端使用 php4 并且看起来没有 PEAR 的情况。是否有已建立的 PHP BBCode 解析器可以与 vBulletin 的 BBCode 系统一起使用?

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

文件:

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

4

2 回答 2

11

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

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

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

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

很抱歉没有帮助的答案(它太大而无法放入评论)。

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

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

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

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

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

于 2009-11-25T20:37:14.577 回答
1

This library doesn't require PEAR and has some tricks for preventing injections.

http://www.christian-seiler.de/projekte/php/bbcode/index_en.html

于 2011-03-20T22:18:44.973 回答