39

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

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

我想一种选择是使用普通的降价解析器,并通过 HTML sanitiser 运行输出,但是有没有更好的方法来做到这一点..?

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

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

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

基本上:

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

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

通过这种方式,Markdown 渲染与输出清理分开,这更简单(两个大部分未修改的代码库)更安全(您不会尝试同时进行渲染和清理),并且更灵活(您可以进行多次清理级别,比如对受信任内容的更宽松的配置,以及对公众评论更严格的版本)

4

3 回答 3

27

PHP Markdown 有一个消毒剂选项,但它似乎没有在任何地方做广告。看看Markdown_Parser类的顶部markdown.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 行)那样缓存它,所以它可能有点慢。

于 2009-07-01T15:57:01.043 回答
2

JavaScript Markdown 编辑器假设:

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

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

于 2009-05-20T14:57:29.837 回答
-1

在通过降价处理之前,在用户输入的输入上运行 htmlspecialchars 怎么样?它应该逃避任何危险,但留下 Markdown 理解的一切。

我正在尝试考虑这种方法行不通但无法想到任何事情的情况。

于 2010-01-14T10:07:34.707 回答