&引用;“安全”;PHP的降价处理器?
是否有适合在公共评论中使用的PHP标记实现 基本上,它应该只允许标记语法的一个子集(粗体、斜体、链接、块引号、代码块和列表),并去掉所有内联HTML(或者可能转义它?) 我想一种选择是使用普通的标记解析器,并通过HTML消除器运行输出,但是有没有更好的方法来做到这一点呢 我们正在为站点的其余部分使用PHP markdown Extra,因此我们已经必须使用辅助解析器(非“Extra”版本,因为脚注支持之类的东西是不必要的)。。仅解析&引用;“安全”;PHP的降价处理器?,php,security,user-input,markdown,Php,Security,User Input,Markdown,是否有适合在公共评论中使用的PHP标记实现 基本上,它应该只允许标记语法的一个子集(粗体、斜体、链接、块引号、代码块和列表),并去掉所有内联HTML(或者可能转义它?) 我想一种选择是使用普通的标记解析器,并通过HTML消除器运行输出,但是有没有更好的方法来做到这一点呢 我们正在为站点的其余部分使用PHP markdown Extra,因此我们已经必须使用辅助解析器(非“Extra”版本,因为脚注支持之类的东西是不必要的)。。仅解析*bold*文本并将所有内容转义到a href=“etc”,似乎
*bold*
文本并将所有内容转义到a href=“etc”
,似乎比生成bold
文本并尝试剥离我们不需要的位更好
另外,在一个相关的注释中,我们正在对“主”站点使用大规模杀伤性武器控制,但是对于评论,还有什么其他选项?WMD的javascript预览很好,但它需要与PHP标记处理器相同的“中性化”(它不能显示图像等,否则会有人提交,他们的工作标记将“中断”)
目前,我的计划是使用PHP markdown->HTML santiser方法,并编辑WMD以从shodown.js
中删除图像/标题语法,但这似乎已经做了无数次了
基本上:
- PHP中是否有“安全”的降价实现
- 是否有HTML/javascript标记编辑器可以轻松禁用相同的选项
markdown()
输出
通过这种方式,标记呈现与输出清除分离,输出清除更简单(两个基本上未修改的代码基),更安全(您不需要同时进行呈现和清除),并且更灵活(您可以有多个净化级别,比如对受信任的内容进行更宽松的配置,对公开评论使用更严格的版本)JavaScript标记编辑器假设:
- 使用JavaScript驱动的降价编辑器,例如,基于决战
- 从工具栏中删除不需要的项目的所有图标和视觉线索
- 设置JavaScript过滤器以在提交时清除不需要的标记
- 在计算机上本地测试并强化所有JavaScript更改和过滤器
- 在PHP提交脚本中镜像这些过滤器,以便在服务器端捕获相同的过滤器
- 从帮助/教程中删除对不需要的项目的所有引用
我已经用JavaScript创建了一个标记编辑器,但它有增强的功能。这花费了大量的时间和SVN修订。但我认为修改标记编辑器以限制允许的HTML不会有那么困难。PHP标记有一个消毒剂选项,但似乎没有在任何地方发布。请看
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行)是的,所以可能有点慢。在通过markdown处理之前,对用户输入的输入运行htmlspecialchars怎么样?它应该避免任何危险,但保留markdown理解的所有内容
我试图考虑这样一种情况,即这种方法不起作用,但无法立即想到任何东西。不接受答案,因为
无标记
选项允许
等(包括样式=
等属性)。我只是简单地处理了标记,然后通过HtmlPurifier运行了输出。我刚刚用
测试了我的do\u markdown
函数,结果它像预期的那样变成了一个充满转义HTML的段落;我忍不住认为你忽略了一些东西。我也测试了它,它正确地转义了给定的字符串。这不针对[link](javascript:alert('xss')进行保护
!是的,您应该转义xss:s的每个指向html属性的参数。很可能在某些情况下,标记呈现可能会取消转义htmlspechachar。可能类似于>脚本
。只清理标记输出,而不是尝试清理标记(我最后做的事情),会更安全/更简单将输入转义到Markdown不足以确保安全:例如“[clickme](javascript:alert%28%22xss%22%29)
”。有关更多详细信息,请参阅我的解释。相关: