6

从 2 个不同的应用程序,我能够发送跨组织请求。虽然浏览器返回 Cross-Origin 错误,但我的服务器仍在接收和执行请求。例如,从远程站点,我可以使用以下方法调用跨域请求,

$.ajax({
        xhrFields: {
            withCredentials: true
        },
        data:{ my: 'a' },
        url: 'http://MyApp/Page',
        type: 'POST'
})

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

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

4

3 回答 3

2

您所说的漏洞是CSRF,但可以防范。

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

然而,在过去有一些通过插件(例如 flash)的漏洞利用,其中可以设置标头,而通过浏览器(例如Referer)是不可能的,因此为了防止这种情况,建议使用同步器令牌模式,该模式涉及在将被验证的隐藏字段以及所有破坏性请求的 cookie。我所说的破坏性是指更改、提交或删除事物的请求(即应该是 POST)。

有关更多信息,请参见此处:http ://www.html5rocks.com/en/tutorials/cors/

于 2013-10-24T16:07:19.020 回答
1

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

于 2013-10-24T13:57:17.530 回答
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

于 2013-10-24T13:34:40.890 回答