【发布时间】:2014-06-20 07:27:24
【问题描述】:
我正在使用令牌来防止我的应用程序中的 CSRF 攻击。但是这个应用程序是单页的,并且大量基于 AJAX,所以我需要找到一种方法来为单页中的 N 个操作提供有效的令牌:
例如一个文档片段加载了 3 个可能的操作,每个操作都需要一个令牌才能正常工作,但服务器端一次只有一个有效令牌...
由于每个令牌都只是一个encrypted nonce(该值不是基于特定形式),因此我提出了通过以下方式自动为每个操作分配令牌的想法:
- App 拦截 AJAX 调用,并检查是否为敏感操作(即删除用户)
- 在操作继续之前向服务器请求令牌
- 生成令牌,然后添加到操作请求中
- 自请求包含有效令牌后执行的操作
- 对通过 AJAX 执行的任何后续操作执行相同操作
我认为该方法不够有效,因为攻击者可以使用与我的应用完全相同的脚本(检索令牌并附加到请求)。
如何改进我的方法以有效抵御 CSRF 攻击?
附加信息:我的后端环境是 PHP/Phalcon,令牌是 generated using Phalcon。
【问题讨论】:
-
假设您使用会话登录并且不允许未登录的用户删除用户,攻击者将如何登录并执行请求?如果它是对您的真正 CSRF 攻击以删除用户,那么攻击者将如何知道您的 nonce?如果它是一个公共 API,是的,他们可以先抓取您的页面,然后获取随机数,然后执行请求,您无法 100% 停止,您可以添加层但仍然可以。您甚至可以使用带有与用户相关的参数的加密字符串来代替 nonce,但通常它是矫枉过正的。
-
“每个动作都需要一个令牌才能正常工作,但服务器端有时只有一个有效令牌......” - 然后更改:为 每一个可能的动作。