PHP的“安全”降价处理器?

时间:2009-05-19 23:23:58

标签: php security user-input markdown

是否有适合在公开评论中使用的降价的PHP实现?

基本上它应该只允许markdown语法的一个子集(粗体,斜体,链接,块引用,代码块和列表),并删除所有内联HTML(或者可能转义它?)

我想一个选项是使用普通的降价解析器,并通过HTML杀菌器运行输出,但是有更好的方法吗?

我们在网站的其余部分使用PHP markdown Extra,因此我们必须使用辅助解析器(非“Extra”版本,因为脚本支持之类的东西是不必要的)..它似乎也似乎更好地解析*bold*文本并将所有内容转义为&lt;a href="etc"&gt;,而不是生成<b>bold</b>文本并尝试剥离我们不想要的内容。

另外,在相关的说明中,我们使用WMD控件作为“主”站点,但是对于评论,还有哪些其他选项? WMD的JavaScript预览很好,但它需要与PHP降价处理器相同的“中性”(它不能显示图像等等,否则有人会提交并且他们的工作降价会“破坏”)

目前我的计划是使用PHP-markdown - &gt; HTML santiser方法,并编辑WMD以从showdown.js中删除图像/标题语法 - 但似乎这已经无数次地完成了..

基本上:

  • PHP中是否有“安全”的降价实现?
  • 是否有HTML / javascript markdown编辑器可以轻松禁用相同的选项?

更新:我最终只是通过HTML Purifier运行markdown()输出。

这样Markdown呈现与输出消毒是分开的,输出消毒更简单(两个大多数未经修改的代码库)更安全(你不是一次尝试渲染和消毒),而且更灵活(你可以有多个卫生级别,比如说可信内容的配置更松懈,公众意见的版本更严格)

4 个答案:

答案 0 :(得分:27)

PHP Markdown有一个清洁剂选项,但它似乎没有在任何地方做广告。查看Markdown_Parsermarkdown.php类的顶部(从1.0.1m版本的第191行开始)。我们对209-211行感兴趣:

# Change to `true` to disallow markup or entities.
var $no_markup = false;
var $no_entities = false;

如果将这些更改为true,则应分别转义标记和实体,而不是逐字插入。似乎没有任何内置方法可以更改它们(例如,通过构造函数),但您可以随时添加一个:

function do_markdown($text, $safe=false) {
    $parser = new Markdown_Parser;
    if ($safe) {
        $parser->no_markup = true;
        $parser->no_entities = true;
    }
    return $parser->transform($text);
}

请注意,上面的函数在每次运行时都会创建一个新的解析器,而不是像提供的Markdown函数那样缓存它(第43-56行),所以它可能有点慢。

答案 1 :(得分:2)

JavaScript Markdown Editor假设:

  • 使用JavaScript驱动的Markdown编辑器,例如,基于showdown
  • 从工具栏中删除所有不需要的项目的图标和视觉线索
  • 设置JavaScript过滤器以清除提交时不需要的标记
  • 在计算机上本地测试并强化所有JavaScript更改和过滤器
  • 在PHP提交脚本中镜像这些过滤器,以便在服务器端捕获它们。
  • 从“帮助/教程”中删除对不需要的项目的所有引用

我在JavaScript中创建了Markdown编辑器,但它具有增强功能。这需要花费大量时间和SVN修订版。但我认为改变Markdown编辑器以限制允许的HTML并不困难。

答案 2 :(得分:-1)

如果您正在编写自己的解析器,为什么不使用BBCode架构。

提交/(用户)注释时,需要使用mysql_escape_real_string()清理文本,是的还有其他函数,但这会停止任何JS注入。

答案 3 :(得分:-1)

如何在用户输入的输入上运行htmlspecialchars,然后通过markdown处理它?它应该逃脱任何危险,但留下降价理解的一切。

我试图想一个这样的情况,这种情况不会起作用,但却无法想到任何事情。