没有会话或数据库的安全CSRF保护?

问题描述 投票:5回答:2

我正在尝试对HTML登录表单实施安全的CSRF保护,我知道实现CSRF保护的最佳方法是在会话中存储随机csrf_key,但我想将CSRF添加到我的登录和注册表单......而我不知道想为任何匿名的未注册用户存储多个会话...

所以我想创建最好的安全posibble而不使用会话或数据库,只有表单隐藏字段/&一个cookie,登录后我将使用会话csrf保护。

我对secure user_storage的想法只有csrf:

csrf_token = AES(ip + useragent + timestamp + random_data,csrf_aes_site_key)

当csrf_aes_site_key在配置文件中被硬编码时。 并且在每次登录/注册后,我将解密AES字符串+ velidate,ip&ua匹配请求ip&ua,时间戳不是太匹配,比如5分钟(如果csrf_timestamp + 18000> = current_ts),random_data只是随机性(并确保同一用户在相同的ts中多次请求时不会获得相同的csrf_token)...

所以...它足够安全,它是一个很好的解决方案吗? 如果没有,还有其他建议可以解决这个难题吗? 谢谢!

编辑:我刚刚创建的实现,它工作正常,但它是否足够好?

完整示例: https//github.com/itaiarbel/aes_based_csrf_protection

问题1:用户可以使用相同的令牌为下一个5min的bug获取csrf_token并成功提交给表单吗? 如果用户提交多次,我该怎么办? 只要不是csrf攻击......

问题2:如果页面打开5分钟,用户将忘记登录,(每5分钟自动重新登录页面?maby将其更改为1h?)

您是否可以通过此实施发现任何特定的安全风险? 或者我可以假设这是一种安全的CSRF保护方式吗?

php security session cookies csrf-protection
2个回答
6
投票

将CSRF令牌存储在cookie中的方法被广泛使用( AngularJSDjango ),但它的工作方式略有不同。 服务器在cookie中发送令牌,客户端使用JavaScript读取cookie并在HTTP头中 反映令牌。 服务器应仅验证HTTP标头中的值,即使cookie也将自动发送。

只要JavaScript前端和后端都知道它们,实际的cookie和标题名称就不重要了。

这可以防止CSRF,因为只有从真实原点运行的JavaScript才能读取cookie(请参阅Wikipedia上的详细讨论 )。 令牌可以是会话cookie的HMAC,这避免了在服务器端记住令牌状态的需要。

主要优点是这种方法(与表单字段中具有令牌的方法不同)适用于单页,基于JavaScript的应用程序,在这些应用程序中,您不在服务器上生成HTML,并且无法在其代码中真正嵌入CSRF令牌。


0
投票

它适用于大多数客户端 - 但是在客户端通过负载平衡代理(通过更改看到的客户端IP)访问您的站点时会非常失败。 一个更正确的解决方案是使用来自whois记录或ASN号码的组织数据,但是在查看这些数据时需要花费一些费用 - 根据流量的大小,仅使用(IPV4)地址的最后16位可能就足够了。

您可能还会遇到问题,具体取决于您存储的用户代理的数量(Google Chrome浏览器可以动态更新)。

© www.soinside.com 2019 - 2024. All rights reserved.