我正在阅读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
答案 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编码器)逃脱它。
等等。