从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请求。怎么避免这个?
答案 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