dbr*_*dbr 36 php security markdown user-input
是否有适合在公共评论中使用的降价的PHP实现?
基本上它应该只允许markdown语法的一个子集(粗体,斜体,链接,块引用,代码块和列表),并删除所有内联HTML(或可能转义它?)
我想一个选择是使用普通的降价解析器,并通过HTML杀菌器运行输出,但是有更好的方法吗?
我们在网站的其余部分使用PHP markdown Extra,因此我们必须使用辅助解析器(非"Extra"版本,因为脚本支持之类的东西是不必要的)..它似乎也更好解析在*bold*文本和拥有一切逃到<a href="etc">,不是生成<b>bold</b>的文本,并试图剥夺我们不想位..
此外,在相关的说明中,我们使用WMD控件作为"主"站点,但是对于评论,还有哪些其他选项?WMD的javascript预览很好,但它需要与PHP降价处理器相同的"中性"(它不能显示图像等等,否则有人会提交并且他们的工作降价会"破坏")
目前我的计划是使用PHP-markdown - > HTML santiser方法,并编辑WMD以从中删除图像/标题语法showdown.js- 但似乎这已经无数次完成了..
基本上:
更新:我最终只是markdown()通过HTML Purifier运行输出.
这样Markdown呈现与输出消毒是分开的,输出消毒更简单(两个大多数未经修改的代码库)更安全(您不是一次尝试渲染和消毒),而且更灵活(您可以进行多次消毒)等级,比如说可信内容的配置更宽松,公众评论的版本更严格)
Noa*_*ing 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;
Run Code Online (Sandbox Code Playgroud)
如果您将这些更改为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);
}
Run Code Online (Sandbox Code Playgroud)
请注意,上面的函数在每次运行时都会创建一个新的解析器,而不是像提供的Markdown函数那样缓存它(第43-56行),所以它可能有点慢.