Ich verstehe nicht, wie die Verwendung eines „Challenge-Tokens“ irgendeine Art von Prävention bietet: Welcher Wert sollte mit was verglichen werden?
Von OWASP:
Im Allgemeinen benötigen Entwickler nur Generieren Sie dieses Token einmal Aktuelle Sitzung. Nach der Initialisierung Die Generierung dieses Tokens, dessen Wert ist in der Sitzung gespeichert und verwendet Für jede weitere Anfrage, bis Sitzung abgelaufen.
Wenn ich den Prozess richtig verstehe, passiert Folgendes.
Ich melde mich bei http://example.com an und erstelle eine Sitzung/ein Cookie mit diesem zufälligen Token. Jedes Formular enthält dann eine versteckte Eingabe, die auch einen Zufallswert aus der Sitzung enthält, der bei der Formularübermittlung mit der Sitzung/dem Cookie verglichen wird.
Aber was kann damit erreicht werden? Holen Sie sich nicht einfach die Sitzungsdaten, fügen Sie sie auf die Seite ein und vergleichen Sie sie mit genau denselben Sitzungsdaten? Scheint ein Zirkelschluss zu sein. In diesen Artikeln wird ständig davon gesprochen, einer „Same-Origin-Richtlinie“ zu folgen, aber das macht keinen Sinn, weil alle CSRF-Angriffe vom Benutzer ausgehen und den Benutzer lediglich dazu verleiten, etwas zu tun, was er/sie nicht beabsichtigt.
Gibt es außer dem Anhängen des Tokens als Abfragezeichenfolge an jede URL noch andere Optionen? Sieht sehr hässlich und unpraktisch aus und erschwert Benutzern das Setzen von Lesezeichen.
CSRF 通过类比解释 - 示例:
冒充者拿走了你所有的钱,也许在出去的时候玩了一些 Xbox......
摘要
CSRF 基本上依赖于这样一个事实:您打开了家门,然后将其打开,让其他人可以简单地走进来并假装是您。
如何解决这个问题?
当您第一次打开家门时,门卫会给您一张纸,上面写着一个很长且非常随机的数字:
现在,如果你想进入自己的房子,你必须向门卫出示那张纸才能进去。
所以现在当冒充者试图进入你的房子时,门卫会问:
“纸上写的随机数是多少?”
如果冒充者没有正确的数字,那么他就无法进入。要么他必须正确猜测随机数 - 这是一项非常困难的任务。更糟糕的是,随机数的有效期只有 20 分钟(例如)。所以知道模仿者必须猜对,不仅如此,他只有20分钟的时间才能得到正确答案。这实在是太费劲了!所以他放弃了。
当然,这个类比有点牵强,但我希望它对你有帮助。
**crud =(创建、读取、更新删除)
攻击者无法获取令牌。因此请求不会生效。
我推荐 Gnucitizen 的这篇文章。它有一个相当不错的 CSRF 解释: http://www.gnucitizen.org/blog/csrf-揭秘/