HTML属性编码/转义与常规HTML编码有何不同?

时间:2012-09-10 23:06:38

标签: html security escaping

我注意到OWASP建议使用a different encoding method专门用于编码HTML属性,而在ASP.NET MVC中,a helper method专门用于编码属性。

但是,我还没有想到任何HTML编码字符串在HTML属性的上下文中不起作用的情况。是否存在使用标准HTML编码不足或不正确的情况?如果没有,为什么在某些框架中提供这些额外的方法?

(注意not all string escaping frameworks提供了这样的方法。)

2 个答案:

答案 0 :(得分:1)

我头脑中的一个例子是,如果你在一个属性中引用了文本,你显然必须转义引号,而这对于常规的html编码来说并不是必需的(尽管大多数框架都是这样做的)是安全的。)

一般来说,试图逃避html和css是非常复杂的。更糟糕的是,即使存在标准,浏览器也不会完全遵循标准。通常情况下,它们会更宽松,允许在脚本标记中使用空字符而不是空格,这样攻击者就可以绕过天真的转义方法。当然,每个浏览器的确切行为都不同。本书 The Tangled Web 详细介绍了该领域一些更有趣的陷阱。

答案 1 :(得分:1)

当您深入了解reference implementation时,encodeForHTMLAttribute方法会使用一组不需要的免疫字符来调用HTMLEntityCodec classencode方法被编码。在encode方法中,继承自Codec class,您可以看到任何不在免疫集合中的非字母数字字符将由字符编码参考

现在你已经注意到HTML和HTML属性的免疫集合是不同的,特别是在HTML属性中,空间不被认为是免疫的:

private final static char[]     IMMUNE_HTML = { ',', '.', '-', '_', ' ' };
private final static char[] IMMUNE_HTMLATTR = { ',', '.', '-', '_' };

原因可能是因为HTML属性不一定需要引用。当quotes are missing时,文字space character将结束属性值。在这种情况下,空格字符需要由字符引用进行编码,以便将其解释为值的一部分。