我继承了一些最近被攻击的代码,攻击者发送了重复的远程表单提交.
我使用我为每个用户创建的会话身份验证令牌(而不是会话ID)实施了预防.虽然我意识到这个特定的攻击不是CSRF,但我从这些帖子中调整了我的解决方案(尽管已过时).
https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29
http://tyleregeto.com/a-guide-to-nonce
http://shiflett.org/articles/cross-site-request-forgeries
但是,它仍然觉得这里存在一些漏洞.虽然我知道没有什么是100%安全的,但我有一些问题:
潜在的攻击者是否只能启动一个有效的会话,然后在每个请求中包含会话ID(通过cookie)?
似乎nonce会比会话令牌更好.生成和跟踪nonce的最佳方法是什么?
我遇到了一些关于这些解决方案只是单一窗口的观点.有人可以详细阐述这一点吗?
这些解决方案总是需要会话吗?或者这些令牌可以在没有会话的情况下创建吗?更新,这个特定的页面只是一个页面形式(没有登录).因此,仅仅为了生成令牌而启动会话似乎过多了.
是否有一个更简单的解决方案(不是CAPTCHA),我可以实现以防止这种不会使用会话的特定攻击.
最后,我正在寻求更好的理解,以便我可以实现更强大的解决方案.
据我所知,你需要做三件事:让所有人改变数据操作只能使用POST请求,不允许没有有效引用的POST请求(它必须来自同一个域)并在每个POST请求中检查auth令牌( POST令牌值必须与cookie中的令牌相同).
前两个将使得很难做出任何有害的CSRF请求,因为它们通常是电子邮件,其他网站等中的隐藏图像,并且在现代浏览器中制作具有有效引用的跨域POST请求应该是不可能/难以做到的.如果没有窃取用户的cookie /嗅探他的流量,这将使得完全不可能做任何有害行为.
现在关于你的问题:
这个问题让我很困惑:如果你正确使用auth令牌,那么攻击者必须知道来自cookie的用户令牌以及请求一起发送它,那么为什么启动一个有效的攻击者自己的会话可以造成任何伤害呢?
Nonces将使你的所有链接变得丑陋 - 我再也见不到有人使用它们了.我认为您的网站可以使用它进行计量,因为您必须保存/搜索数据库中的所有nounces - 很多生成nounce的请求可能会非常快地增加您的数据库大小(并且搜索它们会很慢).
如果每个user_id只允许一个nounce来阻止(2)Dos攻击,那么如果用户打开一个页面,然后打开另一个页面然后提交第一页 - 他的请求将被拒绝,因为生成了新的nounce并且旧的已经无效.
除了cookie,GET或POST变量之外,您如何识别没有会话ID的唯一用户?
UPD:因为我们不再谈论CSRF:你可以实施许多模糊的防御措施,防止蜘蛛机器人提交你的表格:
隐藏的表单字段不应该填充(机器人通常填充他们看到的具有良好名称的大多数表单字段,即使它们真的是为用户隐藏的)
Javascript鼠标跟踪器(您可以分析记录的鼠标移动以检测机器人)
文件请求日志分析(加载页面时javascript/css/images应该在大多数情况下加载,但有些(非常罕见)用户关闭它)
Javascript表单更改(当一个隐藏(或不)字段添加到服务器端需要的javascript表单时:机器人通常不执行javascript)
像Snort这样的流量分析工具可以检测Bot模式(奇怪的用户代理,过快的表单提交等).
以及更多,但在一天结束时,一些现代机器人使用真实用户行为的总体模拟(使用真正的浏览器API调用) - 所以如果有人真的想要攻击你的网站,没有这样的防御将帮助你.即使CAPTCHA今天也不是很可靠 - 除了复杂的图像识别算法,你现在可以购买1000个CAPTCHA,由人类为任何网站解决,价格低至1美元(你可以在发展中国家找到这样的服务).所以真的,没有100%防御机器人 - 每种情况都不同:有时你必须自己创建复杂的防御系统,有时只需要一点点调整就会有所帮助.