我正在为Angular SPA编写REST Api网关,但我面临的问题是,针对“数据窃贼”保护SPA API公开的数据。我知道我不能对HTML抓取做很多事情,但是至少我不想为这样的数据窃贼提供用户体验以及发送到SPA的JSON的全部功能。
关于该主题的大多数“教程”与主题之间的区别是,我将这些数据公开到一个公共网站(这意味着不需要用户身份验证),该网站提供了有关视频游戏的有价值的统计信息。
我关于如何保护SPA的Rest API的初步想法:
在各处使用JWT。访客第一次打开网站时,SPA第一次从我的REST Api请求JWT并将其保存在HTTPS cookie中。对于所有请求,SPA必须使用JWT来获得响应。
该方法存在的问题
我的问题:
我觉得这是一个普遍的问题,因此我想知道,除了可以直接访问我的REST Api响应的SPA之外,还有没有其他好的解决方案来防止他人入侵?
答案 0 :(得分:3)
从API的角度来看,您的SPA与其他任何客户端都没有什么不同。您显然不能在SPA中包含秘密,因为它会发送给任何人并且无法得到保护。同样,它对API的请求也可以轻松地被另一个客户端嗅探和复制。
因此,简而言之,正如这里多次讨论的那样,您无法验证客户端应用程序。任何人都可以根据需要创建其他客户端。
您可以实际做的一件事是检查请求的引用/来源。如果客户端在浏览器中运行,则它可以发出的请求会受到一定程度的限制,其中一种限制是引用者和来源标头,它们始终由浏览器控制,而不是由javascript控制。因此,您实际上可以确保,如果(且仅当!)客户端在未修改的浏览器中运行,则将从您的域中下载该客户端。这是浏览器中的默认设置,因此,如果您不发送CORS标头,则您已经做到了(实际上,浏览器确实如此)。但是,这并不能阻止攻击者构建和运行非浏览器客户端并伪造他喜欢的任何引用或来源,或者只是忽略相同的来源策略。
您可以做的另一件事是定期更改API,足以阻止流氓客户端正常工作(并同时更改客户端)。显然,这根本不安全,但是对于攻击者来说可能会很烦人。如果需要一次下载所有数据,那么这再无济于事。
您应该考虑的一些真实事物是
实际上有人要下载您的数据吗?这个值多少钱?在大多数情况下,没有人希望创建其他客户端,也没有人对数据如此感兴趣。
如果 很有趣,则您至少应实施用户身份验证,并通过合法的合同下方和/或合同中的规定承担其余的风险。
您可以实施限制以不允许批量下载。例如,如果典型用户每5秒访问1条记录,而总共访问10条记录,则可以基于客户端IP构建规则,例如以合理地限制用户访问。请注意,尽管速率限制必须基于客户端无法随意修改的参数,并且没有身份验证,但这几乎只是客户端IP,并且您将面临NAT背后的用户(例如,公司网络)的问题。
同样,您可以实施监视以发现是否有人下载的数据超出正常或必要的数量。但是,如果没有用户身份验证,唯一的选择就是禁止客户端IP。因此,再次取决于知道用户是谁。身份验证。