【问题标题】:Preventing manual POST requests in a following system防止以下系统中的手动 POST 请求
【发布时间】:2014-05-22 20:55:15
【问题描述】:

我的 PHP 网站(如 twitter)上有一个跟踪系统。要关注另一个用户,该用户将单击他们想要关注的用户个人资料上的关注按钮。

然后我发送一个带有他们想要关注的用户 ID 的 ajax 发布请求。

我正在尝试通过在浏览器控制台中编写以下内容来防止用户垃圾邮件跟踪每个人:

for(var i = 0; i<10000000; i++){
     followUser(i) // followUser is the ajax request
}

我提出的解决方案是:

向每个请求添加一个一次性使用令牌,并检查存储在会话中的令牌,例如 CSRF/双重提交保护。

该解决方案有什么问题吗?我研究过使用匿名 JavaScript 函数,但在服务器端而不是客户端阻止这些事情似乎更安全。

【问题讨论】:

  • 您还可以实现这样无法猜到的神秘用户 ID。除此之外,一次性令牌也是我的想法。 (仍然可以发送垃圾邮件,只是需要付出更多努力)

标签: javascript php ajax security csrf


【解决方案1】:

这个解决方案有什么问题吗?

如果您将令牌存储在每个文档的 DOM/JS 上下文中,那么您可能会破坏应用程序的导航和多选项卡使用。 (例如,想象一下关注某人,然后单击上一页上的返回并关注某人。旧页面的令牌现在无效并且操作失败。)这就是一次性 CSRF 令牌通常是坏事的原因。

在服务器端而不是客户端阻止这些事情似乎更安全。

确实,但一次性令牌并不能真正阻止用户发出大量请求,它只是意味着他们每次都必须获取一个新令牌。

听起来您真正需要的是某种服务器端限速解决方案。这可以在服务器级别(mod_evasive 等)和/或应用程序中实现(如果您希望有针对性地限制被识别为敏感的特定功能,则这是必需的)。

您的威胁模型是什么?让每个人都关注一个帐户并不立即像是一种攻击。有什么负面影响?攻击者为什么要这样做?例如,如果它是“通过向所有人发送关注通知来造成滋扰”,那么更好的答案可能在于提供更好的工具来管理/忽略通知。

【讨论】:

  • 我看到了令牌的问题,多用途令牌不能解决问题。威胁是我们有另一个共享操作,可能会被利用来向其他用户发送垃圾邮件。我想,在这种情况下,解决方案是限制股票数量。我认为除了使用在 cmets 中建议的 @ToBe 难以猜测的 ID 之外,按照您的建议限制请求的速率的解决方案将是正确的决定。感谢您的帮助。
猜你喜欢
  • 2014-06-17
  • 2017-03-03
  • 1970-01-01
  • 2015-04-17
  • 2018-09-14
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多