2009年3月4日星期三

HTML编码

写WEB应用经常会用到各种各样的编码,其中Html编码又和防范XSS关系很大,如果正确的使用了编码,就会让脚本跑不起来了。
public static String HTMLEntityEncode( String s )
{
StringBuffer buf = new StringBuffer();
int len = (s == null ? -1 : s.length());

for ( int i = 0; i < len; i++ )
{
char c = s.charAt( i );
if (c>='a' && c<='z' || c>='A' && c<='Z' || c>='0' && c<='9' ||
c == ' ' || c == '.' || c == ',')
{
buf.append( c );
}
else
{
buf.append( "&#" + (int)c + ";" );
}
}
return buf.toString();
}

仅仅允许字母、数字、空格、英文逗号、点。

其他的所有全部encoding。

为什么需要这么严格?下面看一个实例

<a href="javascript:test(<%=var%>)" >test</a>

其中var 是输出的变量且用户可以控制,那么仅仅编码常见的单引号、双引号、尖括号等是没用的,攻击者可以如下构造一个XSS:

<a href="javascript:test();alert(/XSS/);()" >test</a>

所以为了抵御未知攻击,我们应该尽量使用白名单的方式。

没有评论: