【问题标题】:How to protect a client-facing json api against bot attacks?如何保护面向客户端的 json api 免受机器人攻击?
【发布时间】:2017-10-28 18:08:11
【问题描述】:

免责声明:我是一名前端开发人员,没有接受过网络安全方面的深入培训。也许我的问题听起来微不足道。坦率地说,我希望是——这意味着有一个简单的解决方案。请不要生气。

我正在开发一个根据现代 Web 应用程序的通用模式构建的单页 Web 应用程序。具体来说,有一个 Web 应用程序本身存在于浏览器中,这是一个基于节点的“前端后端”,负责呈现应用程序并接受来自它的 ajax 请求(其中大部分然后代理到“适当的”后端),然后是负责 CRUD 操作的“真实”后端:

我们希望确保来自“前端后端”的请求源自浏览器中的客户端应用程序,而不是攻击者的脚本。

作为该任务的一部分,我启用了 csrf 保护(使用 csurf 库),但后来我意识到这可能还不够,因为如果攻击者使用浏览器发出正常请求,请检查它在开发工具的网络面板中,然后将该请求中的 cookie 和标头(以及存储在 cookie 中的 csrf 令牌和密钥)复制到他的脚本中,csrf 保护将无法阻止此类请求。至少据我了解csurf 是如何工作的。

因此,我正在寻找一种更好的方法来确保请求来自客户端应用程序。也许有一种方法可以将基于 csrf-token 的常规保护与时间戳相结合,以确保从请求标头复制的 csrf 令牌暂时过期?或者也许还有其他一些解决方案?我不愿意发明自己的安全机制。请指教?

(我在 security.stackexchange.com 上找到了similar discussion,但几乎没有具体建议)

【问题讨论】:

  • 攻击者访问了您的站点。您的 Web 服务器向攻击者发送 HTML 页面和脚本代码。您的“单页网络应用程序”攻击者的脚本:您所做的只是发送一些文本文件;所有的“前端”都在用户(即攻击者)的机器上运行,并在用户(即攻击者)的控制之下。
  • 您也可以像这个库一样将 API 速率限制添加到您的 API github.com/nfriedly/express-rate-limit
  • @melpomene right :-) 现在,为了防止源自浏览器的可疑行为,我们至少有验证码。我要问的是,如果攻击者不直接使用客户端应用程序,而是使用脚本模仿其行为,那么可以使用哪些安全技术。
  • @azangru 我是说实际上没有区别:您的“应用”一个模仿应用行为的脚本。
  • 但是如果 python 脚本向我的站点发送请求,这些请求也不是来自我自己的页面。然而,如果脚本的编写者将来自我自己站点的示例请求的标头添加到此 python 脚本发送的请求中,这将欺骗 CSRF 保护。所以我的问题是如何防范这种不公平性。

标签: security web single-page-application


【解决方案1】:

回答此类问题时首先要说的是“为什么”。您尚未解释您的威胁模型 - 即您试图防御哪些攻击,谁将发起此类攻击,以及这些攻击的影响是什么?正如 melpomene 所说,攻击者已经可以使用您的客户端为所欲为。你想在这里防御什么?

正如 cmets 中所指出的,原则上没有办法实现您想要的:您的后端换前端服务器仅观察流量,而坚定的攻击者可以重现您的客户端 Javascript 使用的任何流量模式。

话虽如此,您可以让攻击者更难了解您的服务是如何工作的,例如通过对数据使用挑战/响应机制或复杂的签名。但是这些“隐蔽安全”技术并没有增加理论上的安全性;攻击仍然是可能的。

另一种势头强劲且可能适用于您的案例的技术是查看呼叫者的行为模式以检测机器人。有几种产品声称可以做到这一点,但我没有使用任何此类工具的个人经验。你可以谷歌例如为detect bot traffic。同样,原则上这些工具可能会被欺骗,但可能会为您的服务增加一些实际的安全性。

最后,您可以在所有操作中使用验证码,以确保(在一定程度上确信)它是人类驱动应用程序而不是脚本。

您需要依靠您的威胁模型来了解什么对您有用。

【讨论】:

  • 这是最大的原因之一:新用户在我们的应用中注册非常简单:其中一种方法就是提交带有电子邮件和密码的表单。但我们不希望机器人注册,我们希望防止通过登录尝试暴力破解密码。因此,例如,在浏览器中,我们可以为特别敏感的表单添加验证码,但这并不能防止以编程方式注册,通过重放客户端应用程序发送到其后端的请求。当然,我们可能需要将注册过程更改为更安全的,而不是保护 api。
  • @azangru Captcha 在这里可能会有所帮助 - 参见例如recaptcha documentation。您的后端换前端服务器验证验证码响应:这不仅仅是客户端。您仍然需要确保攻击者无法访问您的后端(不是后端换前端)服务。您还可以保护登录流程,例如通过要求交互式电子邮件验证或从单个 IP 地址限制注册操作的速率。同样,不是防弹的,但可以提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
  • 2018-03-25
  • 2018-12-27
相关资源
最近更新 更多