我注意到 OWASP 建议使用不同的编码方法专门用于编码 HTML 属性,并且在 ASP.NET MVC 中有一个专门用于编码属性的辅助方法。
但是,我还没有想到 HTML 编码的字符串在 HTML 属性的上下文中不起作用的任何情况。是否存在使用标准 HTML 编码不足或不正确的情况?如果没有,为什么在某些框架中提供了这些额外的方法?
(请注意,并非所有字符串转义框架都提供此类方法。)
我注意到 OWASP 建议使用不同的编码方法专门用于编码 HTML 属性,并且在 ASP.NET MVC 中有一个专门用于编码属性的辅助方法。
但是,我还没有想到 HTML 编码的字符串在 HTML 属性的上下文中不起作用的任何情况。是否存在使用标准 HTML 编码不足或不正确的情况?如果没有,为什么在某些框架中提供了这些额外的方法?
(请注意,并非所有字符串转义框架都提供此类方法。)
当您深入了解参考实现时,该方法会使用一组不需要编码的免疫字符encodeForHTMLAttribute
调用HTMLEntityCodec类encode
的方法。在从Codec类继承的方法内部,您可以看到任何不在免疫集中的非字母数字字符都将由字符引用编码。encode
现在您已经注意到 HTML 和 HTML 属性的免疫集是不同的,特别是在 HTML 属性中,空间不被认为是免疫的:
private final static char[] IMMUNE_HTML = { ',', '.', '-', '_', ' ' };
private final static char[] IMMUNE_HTMLATTR = { ',', '.', '-', '_' };
其原因可能是因为 HTML 属性不一定需要被引用。当引号丢失时,文字空格字符将结束属性值。在这种情况下,空格字符需要由字符引用编码,才能被解释为值的一部分。
我想到的一个例子是,如果你在一个属性中引用了文本,你显然必须转义引号,而这对于常规的 html 编码不是必需的(尽管大多数框架都这样做只是为了更加安全)。
一般来说,试图逃避 html 和 css 是非常复杂的。更糟糕的是,浏览器并不完全遵循标准,即使有标准也是如此。通常它们会更加宽松,允许在脚本标签中使用空字符而不是空格等内容,这允许攻击者绕过幼稚的转义方法。当然,每个浏览器的确切行为都不同。The Tangled Web一书详细介绍了该领域中一些更有趣的陷阱。