跨站点请求伪造Web服务

时间:2014-07-08 15:09:21

标签: django security rest csrf django-csrf

所以我正在开展一个安全审查项目,以确保我们保证某些数据安全(学生数据具体)。我个人现在不需要太担心这个,因为该计划是“现在开发,后来安全”,所以从某种意义上来说,我正在做“过早的安全优化”,但无论如何我还是想知道。

我正在使用内置了一些跨站点请求伪造保护的django。如果我启用它,我就无法预先形成文件上传,但它提供的解决方案是要求将crsf_token放入表单但我不知道实际上有一个表单,因为这部分项目只是一个服务。所以我想知道将此标记为免除CSRF保护是否安全?

没有设置cookie,没有存储会话,并且每个请求必须通过我创建的一小组自签名证书进行身份验证,并且只会给予一小组受信任的人(目前为1)。在我看来,CSRF在这里不适用,这意味着我可以将我需要的东西标记为免除CSRF保护吗?

2 个答案:

答案 0 :(得分:3)

我不知道您网站的来龙去脉,但我会说不,它不能免于CSRF保护

假设您的网站为https://www.example.com,我假设自签名证书是从客户端like this使用的SSL证书。

现在说他们可以与您的网站进行互动,因为他们已经在浏览器中安装了客户端证书。现在,假设您的一位用户不小心访问了www.evil.comwww.evil.com有一个隐藏的表单,可以通过用户的浏览器向您的网站发出请求。此表单提交https://www.example.com/delete_everything

在您的网站执行任何操作之前,它会检查客户端证书 - 嘿它是有效的,所以继续执行此操作。

这就是您需要CSRF保护的原因 - 需要首先从您自己的站点(例如令牌)读取所提交表单的有效负载内的内容。如果www.evil.com尝试通过用户的浏览器阅读此内容,则他们无法受到Same Origin Policy的保护。

答案 1 :(得分:1)

你有很多选择,让我们想一想:

  • 编写一个中间件,在CsrfViewMiddleware之前执行操作并进行一些验证(源ip,标头,令牌等)
  • 使用@csrf_excepmt进行装饰,并在视图函数
  • 中进行验证