CSRF预防无需修改客户端

时间:2014-08-12 11:29:47

标签: rest csrf owasp

我需要在现有的REST服务中集成CSRF Prevention。

我们已经创建了许多休息资源并发布了其他开发人员要使用的详细信息。组织中的任何人都可以使用它。我无法控制他如何使用它,他使用的形式或httpclient。我不知道到目前为止谁使用过它我无法改变所有客户。因此,我无法在表单中添加隐藏的文本字段/标记,因为我无法访问客户端。此外,我不能使用双重身份验证或验证码,因为它不适用于httpclient实现。有没有其他方法可以防止针对CSRF滥用REST服务。

1 个答案:

答案 0 :(得分:0)

您可以通过查看X-Requested-With header

来执行此操作

如果任何Web客户端已经在使用JQuery,那么此标头将自动传递,并确保该请求不是AJAX或HTML表单的跨域请求。 HTML表单根本不会发送此标题,因此如果没有Web客户端使用HTML表单,这将起作用。

如果您的Web客户端使用纯JavaScript,那么您可以检查Origin标头是否设置为有效域。请注意,当请求不是跨域时,某些浏览器的某些版本不会设置此项。

唯一的缺点是,非Web客户端必须设置其中一个标头,或者您可以通过某种方式从REST服务中识别这些非Web客户端,以便在这些情况下绕过检查。 / p>

如果非Web客户端已经发送了以下以外的任何标题: -

  
      
  • 接受
  •   
  • 接受语言
  •   
  • 内容的语言
  •   
  • 最后-事件ID
  •   
  • 内容类型
  •   

然后您可以验证值是否已传递(而不是X-Requested-WithOrigin)以确保这不是CSRF攻击,因为无法在CSRF攻击中发送自定义标头。甚至可以使用User-Agent - 这只能由HTTP客户端欺骗,而不能由浏览器中的攻击者欺骗,这是CSRF攻击可能发生的唯一相关位置。