Django web服务中的跨站点请求伪造

Django web服务中的跨站点请求伪造,django,security,rest,csrf,django-csrf,Django,Security,Rest,Csrf,Django Csrf,因此,我正在进行一个项目,其中将进行安全审查,以确保我们保持某些数据的安全(具体来说是学生数据)。我个人现在不需要太担心这个问题,因为计划是“现在开发,以后安全”,所以从某种意义上说,我正在做“过早的安全优化”,但我还是想知道 我正在使用django,它内置了一些跨站点请求伪造保护。如果我启用它,我就无法执行文件上传,但它给出的解决方案是要求将crsf_令牌放入表单中,但我实际上没有表单,因为项目的这一部分只是一个服务。所以我想知道,将其标记为免于CSRF保护是否安全 没有Cookie集,没有存

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

我正在使用django,它内置了一些跨站点请求伪造保护。如果我启用它,我就无法执行文件上传,但它给出的解决方案是要求将crsf_令牌放入表单中,但我实际上没有表单,因为项目的这一部分只是一个服务。所以我想知道,将其标记为免于CSRF保护是否安全


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

您有很多选择,让我们想想:

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

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

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

      我不知道你的网站的详细情况,但我想说的是,不,它不能免于保护

      说你的网站是
      https://www.example.com
      我假设自签名证书是从客户端使用的SSL证书

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

      在你的站点做任何事情之前,它会检查客户端证书——嘿,它是有效的,所以继续做它的事情


      这就是为什么您需要CSRF保护—提交表单的有效负载中的某些内容,需要首先从您自己的站点读取(例如令牌)。如果
      www.evil.com
      试图通过用户的浏览器阅读此内容,则他们无法阅读,因为它受保护。

      我不知道您网站的详细信息,但我想说不,它不能免于保护

      说你的网站是
      https://www.example.com
      我假设自签名证书是从客户端使用的SSL证书

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

      在你的站点做任何事情之前,它会检查客户端证书——嘿,它是有效的,所以继续做它的事情


      这就是为什么您需要CSRF保护—提交表单的有效负载中的某些内容,需要首先从您自己的站点读取(例如令牌)。如果
      www.evil.com
      试图通过用户的浏览器读取此内容,他们无法读取,因为它受保护。

      如果我执行上述验证,将其标记为豁免是否确实安全?在一般用例中,在视图内进行验证会起到作用。。。您可以完全控制要应用的筛选器,只需检查request和request.META即可查看您拥有的内容。如果我不执行任何验证,请接受SSL验证,假设我需要的证书仅由客户端代码使用,而不是任何人的浏览器使用,该怎么办。我将进行进一步的检查,但假设是这样的话,我就不必担心了,对吗?只有你可以定义你的应用程序的风险,只有你设计你的安全策略。。。我有一些没有csrf验证的Web服务,因为这对我的“业务逻辑安全性”不是必需的,其他的Web服务有基于令牌或其他任何东西的自定义验证。如果我执行上面提到的验证,将其标记为豁免是否真的安全?在一般用例中,在视图中验证就可以了。。。您可以完全控制要应用的筛选器,只需检查request和request.META即可查看您拥有的内容。如果我不执行任何验证,请接受SSL验证,假设我需要的证书仅由客户端代码使用,而不是任何人的浏览器使用,该怎么办。我将进行进一步的检查,但假设是这样的话,我就不必担心了,对吗?只有你可以定义你的应用程序的风险,只有你设计你的安全策略。。。我有一些没有csrf验证的Web服务,因为这对我的“业务逻辑安全”不是必需的,其他的Web服务有基于令牌或其他任何东西的自定义验证。更好的答案!我没想过有人会在他们的浏览器中安装这个。虽然我真的希望我信任的那些拥有这些证书的人不会愚蠢到在他们的浏览器中安装这些证书,但我觉得我仍然应该对此进行保护。谢谢更好的答案!我没想过有人会在他们的浏览器中安装这个。虽然我真的希望我信任的那些拥有这些证书的人不会愚蠢到在他们的浏览器中安装这些证书,但我觉得我仍然应该对此进行保护。谢谢