2010-09-08 242 views
27

我试图从CSRF保护一个应用程序(PHP和大量的JS)。反CSRF令牌和Javascript

我想使用令牌。

很多操作用AJAX做,所以我必须通过JavaScript中的令牌。 如果我想为每个会话或每页加载生成1个令牌,那么很简单 - 我生成新的令牌,将它放在DOM中的某个位置,然后用Javascript找到并发送给处理端。

但是,如果我想使用新的令牌每个操作呢? 我在考虑做一个ajax调用重新生成令牌,然后将结果传递给处理页面。

这会增加安全风险吗? 我在想引诱用户到页面的脚本,它会询问令牌,然后用它来发出请求,但是再次跨域Javascript是禁止的。 可以用闪光灯完成吗?

也许对于保护Ajax调用从CSRF另一种方法?

谢谢!

回答

27

有几种技术,它们一起使用时可提供足够的CSRF保护。

唯一令牌

一个单一的,特定的会话令牌是对于大多数应用足够好。只要确保您的网站没有任何XSS漏洞,否则您使用的任何类型的令牌技术都是浪费。

AJAX调用来重新生成令牌是一个坏主意。谁会守卫卫兵?如果AJAX调用本身容易受到CSRF的影响,那么这种做法有失于目的。带有AJAX的多个令牌通常是个坏主意。它迫使你序列化你的请求,即一次只允许一个AJAX请求。如果你愿意忍受这个限制,你可以为第二个AJAX调用搭载标记来响应第一个请求。

就个人而言,我觉得这是更好地重新认证为关键事务的用户,并保护剩下的交易与特定会话令牌。

自定义HTTP标头

您可以自定义HTTP标头添加到您的每一个请求,并检查它在服务器端存在。实际的密钥/值不需要保密,服务器只需确保它存在于传入请求中。

这种方法是不够好,保护CSRF在浏览器的新版本,但它可能工作过,解决此,如果您的用户对Flash Player的旧版本。

检查引荐

检查网址标头也很好地保护CSRF在新的浏览器。它不可能欺骗这个头文件,尽管在老版本的Flash中是可能的。所以,虽然它不是万无一失,但它仍然增加了一些保护。

解决验证码

强制用户解决验证码也是针对CSRF有效。它不方便,但非常有效。即使您有XSS漏洞,这也许是唯一可以起作用的CSRF保护。

摘要

  1. 使用基于会话令牌,但对于高价值交易
  2. 重新认证添加自定义HTTP头,并且也检查引用。两者都不是自己的万无一失,但不要伤害
+0

添加一个自定义http标题困扰我,我敢肯定,你可以伪造自定义http标题与闪光和发射一个请求到另一台服务器,只要标题元素不在黑名单中。我查看了近期对闪存的更改(在过去3个月内),并且他们修复了控制“跨站点文件上传”攻击所需的整个POST段的能力。除此之外,我认为它的好信息,我给你+1。 – rook 2010-09-08 19:13:26

+0

是的,这里是黑名单,当然引用者是不允许的,但从字面上看,其他的都是。 http://kb2.adobe.com/cps/403/kb403030.html – rook 2010-09-08 19:15:18

+1

@The Rook - Re。添加自定义标题 - 请参阅http://www.adobe.com/devnet/flashplayer/articles/flash_player_10_security.pdf。具体来说,请参阅标题为“标题发送权限”的部分。我引用'当SWF文件希望将自定义HTTP标头发送到其自己的主机以外的任何位置时,发送请求的HTTP服务器上必须有一个策略文件。记住http://stackoverflow.com/questions/2609834/gwt-rpc-does-it-do-enough-to-protect-against-csrf?这就是我了解这个事实的难处。 – 2010-09-08 19:25:47