我遇到了客户端使用 php4 并且看起来没有 PEAR 的情况。是否有已建立的 PHP BBCode 解析器可以与 vBulletin 的 BBCode 系统一起使用?
我只需要将 BBCode 转换为 HTML。这是从 vBulletin 到新平台的数据迁移,所以我不能使用 vBulletin 的 BBCode 解析器。
文件:
我遇到了客户端使用 php4 并且看起来没有 PEAR 的情况。是否有已建立的 PHP BBCode 解析器可以与 vBulletin 的 BBCode 系统一起使用?
我只需要将 BBCode 转换为 HTML。这是从 vBulletin 到新平台的数据迁移,所以我不能使用 vBulletin 的 BBCode 解析器。
文件:
'坚硬的'?我从来没有找到一个可靠的 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
正则表达式,所以空格只是为了便于阅读。任何正则表达式都是可读的。)
去除嵌套大大简化了极端情况的数量。
This library doesn't require PEAR and has some tricks for preventing injections.
http://www.christian-seiler.de/projekte/php/bbcode/index_en.html