Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;“安全”;PHP的降价处理器?_Php_Security_User Input_Markdown - Fatal编程技术网

&引用;“安全”;PHP的降价处理器?

&引用;“安全”;PHP的降价处理器?,php,security,user-input,markdown,Php,Security,User Input,Markdown,是否有适合在公共评论中使用的PHP标记实现 基本上,它应该只允许标记语法的一个子集(粗体、斜体、链接、块引号、代码块和列表),并去掉所有内联HTML(或者可能转义它?) 我想一种选择是使用普通的标记解析器,并通过HTML消除器运行输出,但是有没有更好的方法来做到这一点呢 我们正在为站点的其余部分使用PHP markdown Extra,因此我们已经必须使用辅助解析器(非“Extra”版本,因为脚注支持之类的东西是不必要的)。。仅解析*bold*文本并将所有内容转义到a href=“etc”,似乎

是否有适合在公共评论中使用的PHP标记实现

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

我想一种选择是使用普通的标记解析器,并通过HTML消除器运行输出,但是有没有更好的方法来做到这一点呢

我们正在为站点的其余部分使用PHP markdown Extra,因此我们已经必须使用辅助解析器(非“Extra”版本,因为脚注支持之类的东西是不必要的)。。仅解析
*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标记有一个消毒剂选项,但似乎没有在任何地方发布。请看的顶部de>Markdown\u解析器
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)
”。有关更多详细信息,请参阅我的解释。相关: