如何阻止其他网站发送跨域ajax请求?

时间:2013-10-24 12:47:02

标签: jquery asp.net security cors

从2个不同的应用程序中,我能够发送交叉请求。虽然浏览器返回Cross-Origin错误,但我的服务器仍在接收并执行请求。例如,从远程站点,我可以使用

调用跨域请求
$.ajax({
        xhrFields: {
            withCredentials: true
        },
        data:{ my: 'a' },
        url: 'http://MyApp/Page',
        type: 'POST'
})

我知道浏览器不会返回脚本响应,但我的服务器页面仍然执行。

假设一个无辜的用户登录了一个网站http://abc.com。此应用程序将接受插入记录的发布请求。当无辜的用户访问无辜的http://HackerSite.com时,http://HackerSite.com将能够通过Ajax向http://abc.com发送POST请求。怎么避免这个?

3 个答案:

答案 0 :(得分:2)

您所谈论的漏洞是CSRF,但可以防范它。

您可以通过发送和检查X-Requested-With: XMLHttpRequest标头来防止在AJAX请求之外提交的POST(例如,通过HTML表单)。这也不能通过AJAX跨域发送,因为此标头不在安全列表中(没有CORS)。

然而,在过去,通过插件(例如flash)可以设置一些通过浏览器无法设置的标头(例如Referer),因此为防止这种情况,建议使用{{ 3}}涉及在隐藏字段中设置一个令牌,该字段将被验证以及所有破坏性请求的cookie。破坏性的意思是指更改,提交或删除内容的请求(即什么应该是POST)。

有关详细信息,请参阅此处:synchroniser token pattern

答案 1 :(得分:1)

简单的解决方案,但不完全是防弹,我们称之为“验证令牌”。来自您网站的每条帖子都应该有一个CSRF令牌,您可以在服务器端验证该请求,以确保该请求真正来自您的网站。请查看此信息以获取更多信息:http://shiflett.org/articles/cross-site-request-forgeries

答案 2 :(得分:0)

应适当设置Access-Control-Allow-Origin标头,以禁止您需要的域以外的域。但这仅适用于现代浏览器。 参考http://encosia.com/using-cors-to-access-asp-net-services-across-domains/ http://code.google.com/p/html5security/wiki/CrossOriginRequestSecurity