2013-10-24 93 views
6

从2个不同的应用程序中,我能够发送交叉请求。尽管浏览器返回了跨源的错误,但我的服务器仍在接收和执行请求。例如,从远程站点,我可以使用,如何阻止其他网站发送跨域ajax请求?

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

我知道,浏览器不会返回到脚本响应调用跨域请求,但我的服务器页面仍然执行。

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

+2

很好的问题。如果你有答案,我会欣赏很多,如果你张贴如果。 –

+0

对于WCF服务,您可以在端点配置中将** crossdomainscriptaccessenabled **设置为false。 – Saranya

+2

您将会遇到与表单提交相同的问题,不涉及JavaScript。 CORS规范并没有考虑额外的安全性。相反,它允许您基本上执行您已经可以执行的相同操作(交叉源)sans ajax。 CORS规范有点远,因为它可以确保你的服务器甚至不会收到底层请求,如果你的服务器没有正确选择规范并且相同的请求不能被发送,那么交叉源sans ajax(比如说,通过表单提交)。这最后一个概念被称为预检。 –

回答

2

您正在讨论的漏洞是CSRF,但它可以被防范。

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

然而,在过去有通过浏览器已经通过插件,如闪存,其中标题可以设置是不可能的某些漏洞(例如Referer),所以要警惕这一点,建议使用涉及设定的synchroniser token pattern令牌在隐藏字段中将被验证以及所有破坏性请求的cookie。破坏性是指改变,提交或删除东西的请求(即应该是POST)。

欲了解更多信息,请参阅:http://www.html5rocks.com/en/tutorials/cors/

+0

在我的asp。net web-form case,它发送cookie,下面是预检规则:'如果满足以下条件,浏览器可以跳过预检请求: 请求方法是GET,HEAD或POST,并且 应用程序确实除了Accept,Accept-Language,Content-Language,Content-Type或Last-Event-ID之外,不设置任何请求头。 Content-Type头部(如果设置) www-form-urlencoded multipart/form-data text/plain ' – user960567

+0

但是我会再次检查并且知道。谢谢 – user960567

+0

我认为你是对的 - 我会编辑。 – SilverlightFox

1

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