HTML属性转义

时间:2015-07-20 21:29:32

标签: javascript html escaping encode

我正在阅读OWSAP预防表,但我对第2号规则感到困惑。

  

规则#2 - 在将不受信任的数据插入HTML公共属性之前的属性转义   规则#2用于将不受信任的数据放入典型的属性值,如宽度,名称,值等。这不应该用于复杂的属性,如href,src,style,或任何事件处理程序,如的onmouseover。对于HTML JavaScript数据值,事件处理程序属性应遵循规则#3非常重要。

复杂属性不应该被转义的原因是什么(这不应该用于复杂的属性,如href,src,style )这会产生歧义或打破价值属性?

https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet

1 个答案:

答案 0 :(得分:1)

并不是说它们不应该被转义,而是逃避它们不足以使数据对XSS安全。

转义数据会阻止它突破属性并启动新属性或元素。

如果该属性是可以执行JavaScript的属性,那还不够。

这很容易受到XSS的攻击:

$external_input = '"><script>alert("got you");</script>';
?><input class="<?php echo $external_input ?>">

但如果你逃避$external_input,那么属性值就变得无稽之谈了。它没有害处。

另一方面,即使HTML被转义,也允许执行任意脚本。

$external_input = 'alert("got you");';
?><input onmouseover="<?php echo htmlspecialchars($external_input); ?>">

您需要确保数据对于该值的任何数据格式是安全的(然后您仍然应该将其转义)。

href属性中添加值?确保它是一个URL,并且URL方案是您信任的(例如http:,而不是javascript:)。

在脚本中添加值?为JS(你通常使用JSON编码器)逃脱它。

等等。