我正在尝试为HTML登录表单实现安全的CSRF保护,我知道实现CSRF保护的最佳方法是在会话中存储随机csrf_key,但我想将CSRF添加到我的登录和注册表单中...并且不想为任何匿名未注册用户存储多个会话...
因此,我希望创建最安全的解决方案,而不使用会话或数据库,只使用表单隐藏字段/和一个cookie,在登录后我将使用会话csrf保护。
我的安全用户存储仅CSRF的想法:
csrf_token = AES(ip + useragent + timestamp + random_data,csrf_aes_site_key)
其中csrf_aes_site_key在配置文件中硬编码。每次登录/注册后,我将解密AES字符串并验证ip和ua是否与请求ip和ua匹配,timestamp是否不超过5分钟(如果csrf_timestamp + 18000> = current_ts),random_data就是随机性(并确保同一用户在同一ts中多次请求不会获得相同的csrf_token)...
那么...它足够安全吗?这是一个好的解决方案吗? 如果不是,有没有其他建议来解决这个问题? 谢谢!
因此,我希望创建最安全的解决方案,而不使用会话或数据库,只使用表单隐藏字段/和一个cookie,在登录后我将使用会话csrf保护。
我的安全用户存储仅CSRF的想法:
csrf_token = AES(ip + useragent + timestamp + random_data,csrf_aes_site_key)
其中csrf_aes_site_key在配置文件中硬编码。每次登录/注册后,我将解密AES字符串并验证ip和ua是否与请求ip和ua匹配,timestamp是否不超过5分钟(如果csrf_timestamp + 18000> = current_ts),random_data就是随机性(并确保同一用户在同一ts中多次请求不会获得相同的csrf_token)...
那么...它足够安全吗?这是一个好的解决方案吗? 如果不是,有没有其他建议来解决这个问题? 谢谢!
编辑: 我刚刚创建了一个实现,它工作得很好,但是否足够好呢?
完整的例子: https://github.com/itaiarbel/aes_based_csrf_protection
问题 1: 用户可能会获取 csrf_token 并在接下来的 5 分钟内成功提交表单,使用相同的令牌。 这是个 bug 吗?我关心用户提交多少次并不重要,只要不是 csrf 攻击...
问题 2: 如果页面保持打开状态 5 分钟,用户将无法登录, (每 5 分钟自动刷新登录页面?也许将其更改为 1 小时?)
您能发现此实现中的任何特定安全风险吗?或者我可以认为这是一种安全的 CSRF 保护方式吗?