什么是CSRF令牌? 它的重要性是什么?它是如何工作的?

好吧,我正在写一个Django应用程序,我只想知道一个csrf标记是什么以及它如何保护数据。 如果您不使用csrf标记,发布数据是否不安全?

我知道如何使用csrf_token,但我只需要一些信息如何工作。

跨站点请求伪造(CSRF)用简单的语言

  • 假设您目前在www.mybank.comlogin了您的网上银行
  • 假设从mybank.com将导致(概念上) http://www.mybank.com/transfer?to=<SomeAccountnumber>;amount=<SomeAmount> 。 (您的帐号是不需要的,因为它是由您的login隐含。)
  • 您访问www.cute-cat-pictures.org ,不知道这是一个恶意网站。
  • 如果该网站的所有者知道上述请求的forms(简单!),并正确猜测您已经login到mybank.com (需要一些运气!),他们可以在他们的网页上包含http://www.mybank.com/transfer?to=123456;amount=10000 (其中123456是他们的开曼群岛账户数量, 10000是以前认为你很高兴拥有的数量)。
  • 检索了www.cute-cat-pictures.org页面,因此您的浏览器将提出该请求。
  • 您的银行无法识别此请求的来源:您的networking浏览器将随您的www.mybank.com cookie发送请求,并且看起来完全合法。 有你的钱!

这是没有CSRF令牌的世界。

现在 CSRF令牌更好:

  • 转帐请求通过第三个参数进行扩展: http://www.mybank.com/transfer?to=123456;amount=10000;token=31415926535897932384626433832795028841971 : http://www.mybank.com/transfer?to=123456;amount=10000;token=31415926535897932384626433832795028841971 ?to = http://www.mybank.com/transfer?to=123456;amount=10000;token=31415926535897932384626433832795028841971 ;amount = http://www.mybank.com/transfer?to=123456;amount=10000;token=31415926535897932384626433832795028841971 ; token = http://www.mybank.com/transfer?to=123456;amount=10000;token=31415926535897932384626433832795028841971
  • 这个令牌是一个巨大的,不可能猜到的随机数, mybank.com将在他们提供给您时在自己的网页上包含。 每次向任何人提供任何页面时,都是不同的
  • 攻击者无法猜测令牌,也无法说服你的网页浏览器投降(如果浏览器工作正常……),攻击者将无法创build有效的请求,因为请求www.mybank.com将拒绝错误的令牌(或无令牌)。

结果:你保持你的10000货币单位。 我build议你捐赠一些到维基百科。

(你的旅费可能会改变。)

是的,发布数据是安全的。 但是这个数据的来源不是。 这样,有人可以欺骗用户使用JSlogin到您的网站,同时浏览攻击者的网页。

为了防止这种情况,django会在cookie中发送一个随机的密钥,并且形成数据。 然后,当用户POST,它将检查两个密钥是否相同。 在用户被欺骗的情况下,第三方网站无法获取您网站的Cookie,从而导致身份validation错误。

该网站在生成表单页面时会生成一个唯一标记。 这个令牌是需要发送/获取数据回服务器。

由于令牌是由您的网站生成的,并且仅在生成带有表单的网页时才提供,所以其他一些网站无法模仿您的表单 – 它们将不具有令牌,因此无法发布到您的网站。

它的根本在于确保请求来自网站的实际用户。 为表单生成csrf标记,并且必须绑定到用户的会话。 它用来发送请求到服务器,令牌在其中进行validation。 这是防止csrf的一种方法,另一种方法是检查引用标头。