【发布时间】:2015-06-26 08:41:23
【问题描述】:
我正在尝试对 HTML 登录表单实施安全的 CSRF 保护, 我知道实现 CSRF 保护的最佳方法是在会话中存储随机 csrf_key, 但我想将 CSRF 添加到我的登录和注册表单中......而且我不想为任何匿名未注册用户存储许多会话......
所以我想在不使用会话或数据库的情况下创建最好的安全可能,仅使用表单隐藏字段/& cookie,登录后我将使用会话 csrf 保护。
我的安全 user_storage only csrf 的想法:
csrf_token= AES(ip+useragent+timestamp+random_data, csrf_aes_site_key)
当 csrf_aes_site_key 在配置文件中硬编码时。 并且在每次登录/注册后,我将解密 AES 字符串 + 验证 ip&ua 是否与请求 ip&ua 匹配,并且时间戳不太匹配,比如说 5 分钟(如果 csrf_timestamp + 18000>=current_ts),并且 random_data 只是随机性(并确保同一用户在同一 ts 中多次请求时不会得到相同的 csrf_token)...
所以......它是否足够安全,这是一个好的解决方案吗? 如果没有,还有其他解决这个困境的建议吗? 谢谢!
编辑: 我刚刚创建的实现,它运行良好,但它是否足够好?
完整示例: https://github.com/itaiarbel/aes_based_csrf_protection
问题 1: 用户可以获取 csrf_token 并在接下来的 5 分钟内使用相同的令牌成功提交到表单 漏洞?如果用户提交多次,我关心什么?只要不是csrf攻击...
问题 2: 如果页面保持打开 5 分钟,用户将无法登录, (每 5 分钟自动刷新登录页面?可能改成 1 小时?)
您能发现此实施的任何特定安全风险吗?或者我可以假设这是一种安全的 CSRF 保护方式吗?
【问题讨论】:
-
with only form hidden field /& a cookie这些都是客户端,因此从定义上讲并不安全。 -
但如果我错了,请纠正我,攻击者无法操纵\查看我的 csrf_token 数据,如果他可以,他不能使用此令牌从不同的 ip 创建请求,并且它会过期5 分钟...,唯一的缺点是同一个用户可以在同一个表单上多次使用同一个令牌,直到过期...它对我来说看起来很安全...客户端存储安全性仅受以下因素影响你保存它的方式,我只使用用户存储作为我的加密安全数据的存储单元,这些数据在我没有注意到的情况下无法被操纵......
-
顺便说一句,为什么不只是一个随机数?这里使用加密的目的是什么?
-
因为数据从来没有保存在服务器上,只保存在客户端,所以我没有数据可以比较随机字符串,无法验证令牌......如果你使用会话最好的方法是在会话中保存一个随机字符串...但是如果您不想为每个页面访问者保存会话文件/数据库记录,这是我的解决方法,仅用于登录/注册表单...
-
您可以使用 HMAC (en.wikipedia.org/wiki/Hash-based_message_authentication_code) 代替加密。它会更快。
标签: php security session cookies csrf-protection