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

2022-08-30 12:29:05

是否有适合在公众意见中使用 markdown 的 PHP 实现?

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

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

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

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

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

基本上:

  • PHP中是否有“安全”的降价实现?
  • 有没有一个HTML / javascript markdown编辑器可以很容易地禁用相同的选项?

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

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


答案 1

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

# 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);
}

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


答案 2

JavaScript Markdown Editor Hypothesis:

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

我已经用JavaScript创建了一个Markdown编辑器,但它具有增强功能。这花费了大量的时间和SVN的修订。但我不认为改变Markdown编辑器来限制允许的HTML会那么困难。


推荐