关于CSRF攻击的基本问题

时间:2011-01-21 11:17:39

标签: web-services security csrf

我正在从编程迁移到'网络编程',所以这可能听起来太基本了

我的问题是关于“受害者网站”响应的HTTP请求,其中一些“非公开/敏感”信息为HTML或XML或JSON。

受害者网站只是依赖会话cookie进行身份验证,然后才响应http请求的“非公开”信息。

如果黑客的网站有一个JS向“受害者网站”发出ajax HTTP请求,并且用户已经登录到“受害者网站”,因此在浏览器中有受害者网站的cookie。

ajax请求是否会被“受害者服务器”响应,如果是这样,黑客JS会将此“非公开”信息发回黑客网站。

如何防止这种情况?

3 个答案:

答案 0 :(得分:2)

  1. 您不能通过AJAX向其他域发出请求,而不是执行带有AJAX的JS的域。

    如果受害者的网站是example.com而黑客的网站是example2.com,则来自example2.com的JS文件无法向example2以外的其他网站发出AJAX请求。

  2. 来自受害者服务器的客户端所拥有的cookie不会在HTTP请求中发送到黑客的服务器。如果受害者的网站有一个可被利用的XSS从该网站向黑客发送cookie,则可能会被盗。

答案 1 :(得分:0)

维基百科有一些建议:http://en.wikipedia.org/wiki/Csrf

保持会话Cookie生命周期短。如果您在15分钟不活动后退出,则不太可能成为问题的受害者。不是很友好,但根据您的数据价值需要考虑。

检查Referer:标头以查看它们是否来自您的网站。不是很好。甚至都不好。但它确实存在。

使用特定于用户的表单内容来防止攻击者创建一个简单的表单POST:Understanding the Rails Authenticity Token这个机制非常棒,如果您的框架可以帮助您,那么您的结果几乎是无痛的。如果你的框架没有帮助你,那么考虑一个更好的框架是另一个理由。 :)

答案 2 :(得分:0)

严格意义上的ajax(xmlhttprequest),通常被认为仅限于同一个域,但很多(如果不是全部)取决于浏览器实现安全模型的方式。我注意到的一件事是Firefox即使使用普通(非跨域)ajax也会发出跨域请求,但它会阻止整个响应进入(看起来它会中止请求,导致http 206响应代码)。这意味着,至少在firefox中,“写入调用”需要针对正常的ajax进行CSRF攻击保护。

在这样的浏览器故障旁边,most browsers也支持'cross domain resource sharing',它也可以与xmlhttprequests一起使用。当完成正确的方式时,跨域ajax可以非常安全。

但是,“jsonp”的成功似乎阻碍了CORS的采用;动态插入的脚本包含json中包含在回调参数中的数据,这些脚本不受同一域principel的限制。这样做的安全方式(即防止攻击者网站从受害者站点动态插入和执行脚本,以确保cookie确实将被发送的登录用户)更加困难(在每个请求中需要一个类似会话的令牌)这不在cookie中。)

结论:使用传统的ajax进行读取操作是安全的,对于写入和放大jsonp你必须做一些额外的工作才能安全。如果你真的想跨域,你应该把CORS看成是jsonp的替代品。