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>
所以为了抵御未知攻击,我们应该尽量使用白名单的方式。
没有评论:
发表评论