什么是CSRF令牌? 它的重要性是什么?它是如何工作的?
好吧,我正在写一个Django应用程序,我只想知道一个csrf标记是什么以及它如何保护数据。 如果您不使用csrf标记,发布数据是否不安全?
我知道如何使用csrf_token,但我只需要一些信息如何工作。
跨站点请求伪造(CSRF)用简单的语言
- 假设您目前在
www.mybank.com
login了您的网上银行 - 假设从
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的一种方法,另一种方法是检查引用标头。