0

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

--

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

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

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

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

--

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

假设一个 URL 缩短器的示例站点。

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

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

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

谢谢!

4

2 回答 2

3

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

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

请注意,您只允许某些可以执行操作的时间范围。

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

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

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

于 2012-12-23T01:39:30.823 回答
0

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

于 2012-12-23T01:45:34.423 回答