PHP中的CSRF预防

信息安全 php csrf owasp
2021-08-23 06:47:43

两个问题。

  1. 哪里可以下载 OWASP 的 CSRF Guard 的 PHP 版本?以下 URL 表示要检查 Git:

    https://www.owasp.org/index.php/PHP_CSRF_Guard

    然而,我在 Git 上看到的只是 *.java 文件和 *.js 文件。如果有 PHP 文件,它们在目录结构中的什么位置?

  2. phpBB 通过向所有表单添加两个隐藏参数来防止 CSRF。时间和时间的 SHA1 哈希、每个用户的“表单盐”、会话标识符和表单名称。来源:

    https://github.com/phpbb/phpbb3/blob/c3aa466523e9b074bc4479eccc7b0514972f4b28/phpBB/includes/functions.php#L2544

    我的问题是......为什么除了盐以外的其他东西是必需的?为了防止 CSRF,您只需要一个攻击者无法预测的随机字符串,这样他们就无法盲目发送 HTTP 请求,而盐的形式在我看来可以解决问题。将其与其他所有内容一起散列似乎没有必要。

    也许他们的动机是,如果有人复制/粘贴页面的 HTML 内容,盐形式可能会受到损害?也许它打算在未来证明它?如果直接使用盐形式,则 XSS 漏洞将永久损害 CSRF 保护,而使用时间散列并且盐形式可以防止这种情况。

    另外,如果盐只有两个字符左右,我可以理解做 sha1() 哈希但是两个字符长的盐是不安全的,因为此时您需要做的就是发送 256**2 个盲 HTTP 请求,每个请求都有一个不同的令牌。但它也不是两个字符长。

2个回答
  1. 很奇怪,但你不是第一个问这个问题的人,甚至还有一个建议的 CSRF 保护实现 +托管在 github 上的代码不过,我不能真正保证这种机制,也没有真正仔细检查过它。

  2. 有趣的问题。在我看来,phpbb 的实现有点过头了,但它背后有一些逻辑。单独的盐是不够的,因为在 phpbb 的情况下,user_form_saltvalue 是每个用户的静态值,对于该特定用户不会改变。这意味着一旦知道/披露了这个值(并且可能有很多方法可以泄露或获取这个值),那么所有用户表单都可能受到损害。永远(或更准确地说,在这种盐的持续时间内,但它通常不会改变)。在那里实现的方法具有值不断变化的优点,但它可以由服务器“重现”以进行检查,而无需将其存储在任何地方。它使用现有的存储数据 + 一些随机元素来生成 CSRF 令牌。我不太确定,但我猜想使用一些内部(未公开)随机会话变量作为密钥的时间的哈希/HMAC 会达到相同的结果。

最后,请简短说明一下您对 XSS 和 CSRF 的评论。你之前这么说

如果直接使用盐形式,则 XSS 漏洞将永久损害 CSRF 保护,而使用时间散列并且盐形式可以防止这种情况。

基本上,XSS 漏洞有可能危及任何 CSRF 保护。如果攻击者能够使用用户会话执行代码,那么他们就可以访问所有表单数据,无论这些数据受到的保护如何。

回答第一部分:

OWASP CSRF Guard 的 php 版本已作为OWASP CSRF Protector实现(由于设计逻辑不同,项目名称已更改)。它可以在github上下载!