2009年3月13日星期五

Internet Explorer CSS hacks

测试环境:IE6 , IE7, IE8, FF3.0
表达方式:

body { `background:red }
body { ~background:red }
body { !background:red }
body { @background:red }
body { #background:red }
body { $background:red }
body { %background:red }
body { ^background:red }
body { &background:red }
body { *background:red }
body { (background:red }
body { )background:red }
body { =background:red }
body { +background:red }
body { [background:red }
body { ]background:red }
body { {background:red }
body { |background:red }
body { ,background:red }
body { <background:red }
body { .background:red }
body { >background:red }
body { /background:red }
body { ?background:red }

结论:IE识别所有CSS Hack

比如我们要实现在 IE 中 480px 的宽度,而在其他浏览器 500px 的宽度,就可以通过 Hack 来完成,如下:
#hack {
width
:500px;
+width:480px; /*only IE*/
}

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>

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