2008-07-04

关于dwr的安全性问题

关键字: dwr, 安全
在一些网站中,我们虽然使用了AJAX,但是我们并不希望用户能够私自调用这些AJAX,因为有些AJAX调用会包含对数据的更新操作,即使是只读的操作,也不希望用户能在本地进行直接调用。

在 Michael Chen 的这篇文章中 http://michael.nona.name/archives/142 ,提及了ajax应用中的安全问题,并且给出了一个临时的解决方案。虽然我用的不是 Buffalo ,而是 dwr,但是这篇文章对于 dwr 仍然有帮助。

不过正如 Michael Chen 在文章中所说,他给出的解决方案没有经过详细的测试,所以我在用了一段时间之后,还真就发现了问题。

文中的解决方案的关键是判断 request的Cookie,虽然 dwr 中取得request的方式与 Buffalo不同,但是并不影响,而且经过测试,也确实有效。

可是之后网站增加了静态页面的生成功能,这样用户就可以直接访问静态页,而非提交一个请求。结果问题出现了。

当在静态页中调用 dwr 的应用时,request的 Cookie 也是空的。这样之前的解决方案就无效了。

那么怎么办?或许 http 的 header 中的 referer 能给点帮助!

String referer = request.getHeader("referer");


通过这样的方式我们就能得到一个 referer,那么这个 referer是什么呢?就是请求这个AJAX的地址。我想熟悉盗链功能的朋友对它不会陌生。

这样,当我们从 www.xxx.com 请求 www.xxx.com/index.html 时,而这个 index.html 中又包含一个 AJAX 的调用的时候,我们就可以这么判断:

String referer = request.getHeader("referer");

if(!referer.startsWith("http://www.xxx.com")) {
    throw new Exception();
}


这样就可以保证只允许网站内部的资源访问 AJAX 的应用了。

经过测试,可以做到避免使用浏览器的方式从本地私自访问AJAX应用。但是我想这种方式仍然会存在漏洞,希望大家能给出更好的方案。
评论
发表评论

提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则

您还没有登录,请登录后发表评论

yananay
搜索本博客
我的相册
D35bafa8-5bf0-475f-aa06-16f3080557a1-thumb
tdd
共 3 张
存档
最新评论