【发布时间】: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