【发布时间】:2012-12-10 01:58:23
【问题描述】:
编辑:看起来我对 CSRF 到底是什么感到有些困惑。我已经改写了这个问题
--
所以我知道有很多关于防止 CSRF 的帖子,但是有很多方法可以绕过常用方法:
CSRF Token - 在表单上设置 CSRF 令牌,分配具有相同数据的 cookie 并在服务器端进行匹配
检查用户代理 - 确保所有请求都具有有效用户代理的简单方法。很容易绕过,但仍然是一个简单的检查
基于 IP 的限制 - 根据请求者的 IP 地址限制请求。
--
但这都可以轻松绕过!还有什么办法可以防止这种事情发生?请不要输入验证码。
让我们假设一个 URL 缩短器的示例网站。
- 用户提交请求 -> 返回缩短的 URL。
- 脚本检查有效的引用者(来自原始表单)——很容易被欺骗
- 基于 IP 地址的检查 -- 代理可以轻松解决这个问题
- 检查 CSRF 令牌 -- 垃圾邮件发送者可以通过首先访问原始站点并在对站点的请求中使用设置的 cookie + 令牌轻松绕过此设置
我只是不确定还能做什么?即使是 JavaScript 明智的,可以做些什么来防止这种情况发生?为 cookie 分配超时可能会起作用,但垃圾邮件发送者只会通过访问原始页面来重新分配 cookie。
如果请求率高于平均水平,则可以向垃圾邮件发送者显示验证码。但我也想要一些不会标记有效用户的东西。是的,强制用户必须注册一个帐户可以解决这个问题,但不可行。
谢谢!
【问题讨论】:
-
你似乎在这里混合了你的目标。您是要阻止跨站请求伪造,还是要阻止bots?这是两个不同的东西,只有少量重叠。
-
两者都有!垃圾邮件发送者从远程服务器 (CSRF) 发送请求。我会稍微改一下这个问题。谢谢。
-
我认为您可能会混淆您的术语。 CSRF 是一种exploit,恶意用户通过它诱骗合法用户发出非法请求。听起来您真的只对阻止机器人和一般非法用户感兴趣。这不是 CSRF,这只是机器人保护。
-
我明白了。感谢您的澄清。我只是从它的缩写“跨站点请求伪造”中提取 CSRF -> 从远程服务器而不是原始站点发送的请求。
-
您可能需要查看有关该主题的维基百科文章。给出的示例将有助于进一步澄清:en.wikipedia.org/wiki/…