在一些网站中,我们虽然使用了AJAX,但是我们并不希望用户能够私自调用这些AJAX,因为有些AJAX调用会包含对数据的更新操作,即使是只读的操作,也不希望用户能在本地进行直接调用。
在 Michael Chen 的这篇文章中 [url]http://michael.nona.name/archives/142[/url] ,提及了ajax应用中的安全问题,并且给出了一个临时的解决方案。虽然我用的不是 Buffalo ,而是 dwr,但是这篇文章对于 dwr 仍然有帮助。
不过正如 Michael Chen 在文章中所说,他给出的解决方案没有经过详细的测试,所以我在用了一段时间之后,还真就发现了问题。
文中的解决方案的关键是判断 request的Cookie,虽然 dwr 中取得request的方式与 Buffalo不同,但是并不影响,而且经过测试,也确实有效。
可是之后网站增加了静态页面的生成功能,这样用户就可以直接访问静态页,而非提交一个请求。结果问题出现了。
当在静态页中调用 dwr 的应用时,request的 Cookie 也是空的。这样之前的解决方案就无效了。
那么怎么办?或许 http 的 header 中的 referer 能给点帮助!
通过这样的方式我们就能得到一个 referer,那么这个 referer是什么呢?就是请求这个AJAX的地址。我想熟悉盗链功能的朋友对它不会陌生。
这样,当我们从 www.xxx.com 请求 www.xxx.com/index.html 时,而这个 index.html 中又包含一个 AJAX 的调用的时候,我们就可以这么判断:
这样就可以保证只允许网站内部的资源访问 AJAX 的应用了。
经过测试,可以做到避免使用浏览器的方式从本地私自访问AJAX应用。但是我想这种方式仍然会存在漏洞,希望大家能给出更好的方案。
在 Michael Chen 的这篇文章中 [url]http://michael.nona.name/archives/142[/url] ,提及了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应用。但是我想这种方式仍然会存在漏洞,希望大家能给出更好的方案。