【问题标题】:Preventing CSRF and preventing spammers [closed]防止 CSRF 和防止垃圾邮件发送者 [关闭]
【发布时间】:2012-12-10 01:58:23
【问题描述】:

编辑:看起来我对 CSRF 到底是什么感到有些困惑。我已经改写了这个问题

--

所以我知道有很多关于防止 CSRF 的帖子,但是有很多方法可以绕过常用方法:

CSRF Token - 在表单上设置 CSRF 令牌,分配具有相同数据的 cookie 并在服务器端进行匹配

检查用户代理 - 确保所有请求都具有有效用户代理的简单方法。很容易绕过,但仍然是一个简单的检查

基于 IP 的限制 - 根据请求者的 IP 地址限制请求。

--

但这都可以轻松绕过!还有什么办法可以防止这种事情发生?请不要输入验证码。

让我们假设一个 URL 缩短器的示例网站。

  1. 用户提交请求 -> 返回缩短的 URL。
  2. 脚本检查有效的引用者(来自原始表单)——很容易被欺骗
  3. 基于 IP 地址的检查 -- 代理可以轻松解决这个问题
  4. 检查 CSRF 令牌 -- 垃圾邮件发送者可以通过首先访问原始站点并在对站点的请求中使用设置的 cookie + 令牌轻松绕过此设置

我只是不确定还能做什么?即使是 JavaScript 明智的,可以做些什么来防止这种情况发生?为 cookie 分配超时可能会起作用,但垃圾邮件发送者只会通过访问原始页面来重新分配 cookie。

如果请求率高于平均水平,则可以向垃圾邮件发送者显示验证码。但我也想要一些不会标记有效用户的东西。是的,强制用户必须注册一个帐户可以解决这个问题,但不可行。

谢谢!

【问题讨论】:

  • 你似乎在这里混合了你的目标。您是要阻止跨站请求伪造,还是要阻止bots?这是两个不同的东西,只有少量重叠。
  • 两者都有!垃圾邮件发送者从远程服务器 (CSRF) 发送请求。我会稍微改一下这个问题。谢谢。
  • 我认为您可能会混淆您的术语。 CSRF 是一种exploit,恶意用户通过它诱骗合法用户发出非法请求。听起来您真的只对阻止机器人和一般非法用户感兴趣。这不是 CSRF,这只是机器人保护。
  • 我明白了。感谢您的澄清。我只是从它的缩写“跨站点请求伪造”中提取 CSRF -> 从远程服务器而不是原始站点发送的请求。
  • 您可能需要查看有关该主题的维基百科文章。给出的示例将有助于进一步澄清:en.wikipedia.org/wiki/…

标签: php security csrf spam


【解决方案1】:

您可以为输入字段生成随机名称,然后让您的脚本识别它们。这类似于 Facebook 的做法,效果很好。

【讨论】:

  • 如果你的随机名称直接注入到 DOM 中可能效果很好,但是如果有一个 HTML 表单,form-token 过程实际上是无用的,因为攻击者读取脚本并返回所有字段。提交控件附近的复选框带有注释“如果您是人类,请取消选中此选项”可能非常有效,特别是如果它与在其中一个测试失败时等待几秒钟的脚本配对时。
【解决方案2】:

时间。它通过了。需要存储 CSRF。某处。时光荏苒,这家店也过时了。如果您只留下一定的时间跨度,并且您保留将时间变成其他秘密的秘密,那么垃圾邮件发送者无法“更新”到当前。

任务完成。你如何传递数据——确定在 HTTP 消息中的某个地方,通常在多个地方,例如标题和正文 - 完全由您选择。

请注意,您只允许在某些时间范围内执行操作。

如果您需要更高的安全性,请要求用户身份验证(通过使用凭据登录 - 或通过使用 UA 规范(包括 IP 和请求标头)自动登录)。然后在该会话中,您可以在服务器端保留许多攻击者无法预测的秘密。

例如保持表单名称和值完全动态。在提交之前使用 javascript 旋转输入值,只接受旋转的值。根据时间更改旋转。允许您的秘密的公共部分在单个当前时间共享以计算轮换。如前所述,取决于您的需求。

在这种情况下,HTTP 的无状态特性可能看起来像是一个弱点。但事实上,并非如此。使用它。

【讨论】:

  • 谢谢,我明白了!但问题是,如何阻止“垃圾邮件发送者”表单访问所有站点的页面(即表单页面)并抓取表单名称和定时令牌等?如果我没有误会,当然。当然它会减慢速度,但仍然非常有效。如果我有误解,我很抱歉。另外,随着时间跨度,为 CSRF 令牌分配超时?
  • 哦,还有,对于随机表单名称,名称会存储在会话数据中吗?
  • 好的,从技术上讲,您在这里所做的是创建一个拼图。让我们把它变成一个简单的谜题:只有两个部分。垃圾邮件发送者需要同时拥有这两个部分,并且第一部分可以通过第一个请求获得,当然。接下来是第二部分。那部分取决于你。当然,垃圾邮件发送者总是可以在这里尝试进行逆向工程,但是,垃圾邮件发送者通常会寻找容易 + 很多 => 钱。不是为了昂贵的东西。从技术上讲,您几乎可以绕过所有事情,但实际上对于垃圾邮件发送者来说,它变得太昂贵了。
  • 感谢朋友的解释。我将进一步研究它并制作一个测试脚本。
猜你喜欢
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 2013-09-20
  • 2012-12-06
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
相关资源
最近更新 更多