HTML属性转义

HTML attributes escaping

本文关键字:转义 属性 HTML      更新时间:2023-09-26

我正在阅读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

这并不是说它们不应该被转义,而是转义它们不足以使数据免受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编码器)。

等等