如何保护RESTful服务?

4

考虑为我的网站构建一个Angular 2前端。虽然我的问题与Angular不一定相关,但我想提供完整的背景信息。

向用户显示内容的应用程序逻辑将转移到客户端。因此,在服务器端,我需要通过RESTful JSON源公开数据。令人担忧的是,有人可以完全绕过我的前端,并使用各种参数执行服务请求,有效地爬取我的数据库。我意识到通过抓取HTML实现其中一些可能性,但是公开一个带有格式良好的数据服务只是显而易见的。

有没有办法保护RESTful服务免受此类问题?换句话说,有没有办法确保这种服务仅响应于我Angular 2应用程序的调用?认证当然不是解决方案-我不想强制访问者进行身份验证,而且网络爬虫很可能会进行身份验证并获得访问权限。


使您的API需要一个令牌(随每个请求发送),并且您可以在服务器端验证此令牌以允许/禁止某些操作。 - Simon Arsenault
我发现这篇文章非常有用:https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage - Rob
1
令牌化和限流是必须的,否则 API 就不比爬虫更有吸引力了。 - Estus Flask
爬虫是技术人员。他们可以进行身份验证,查看标头和代码请求,从自己的程序中执行完全相同的操作。 - jacekn
3个回答

1
我不知道有什么明显的方法可以做到这点,但很多人似乎正在把Amazon S3作为模型。如果你在客户端代码中放置凭据,那么任何获取客户端代码的人都可以看到它们。我建议您可以编写服务器以向浏览器传回一个有时限的令牌与客户端代码一起使用。客户端代码需要将其发送回服务器以进行访问。这将防止任何人编写自己的客户端代码,因为只有由服务器发送的客户端代码才能工作,尽管仅在某个时间段内。用户可能会偶尔遇到超时,但这取决于您要使令牌超时的严格程度。当然,即使这种方法也可以被黑客窃取令牌并使用其自己的客户端API,但那时您应该感到骄傲,因为有人正在努力使用您的API!我没有尝试过编写这样的东西,所以我对这个问题没有任何实际经验。我自己也想知道,但对于这种架构,我没有足够的经验来了解其他人是否在做些什么。AngularJS论坛上有什么建议?

其他参考资料:保护REST API / Web服务的最佳实践


尼古拉斯,你已经说过了,通过编程获取下一个有效的令牌是可行的。这可能需要一些工作,但是我有一个需要花费大量时间来维护(数据收集+输入)的数据库。花费一点时间来破解一个时间限制的令牌,以获得准备好且格式漂亮的数据,仍然可以为爬虫节省大量时间。 - jacekn
2
海报上实际上在提出一个数字版权问题。如果您将数据放在公共接口上,有什么阻止人们使用它的方法吗?您可以增加更多的难度,或要求个人访问凭证,但即使如此,你还需要有人去查找版权侵犯,并且需要律师进行终止和撤回请求。排队整个娱乐产业。 - K.Nicholas

1
我建议使用JWT授权。其中一种实现方式是OAuth。基本上,您会获得一个由您信任的机构签名的JSON Web令牌(JWT),该令牌告诉有关用户及其在API上可以访问哪些资源的信息。
如果请求不包括授权令牌,则您的API将拒绝它。
如果令牌在授权机构签署后被某人篡改,试图授予自己特权,则您的API将拒绝它。
这是一个非常酷的工具。
site网站提供有关不同语言中OAuth实现的信息,希望您喜欢的语言已列出。
一些轻松的阅读可作为睡前读物。

0

我认为答案是“不行”。

你可以通过一些安全性混淆的方式来保护你的数据。你的REST API可以暴露一些乱码数据,然后你可以在代码中隐藏一些函数来解密它。虽然这显然不是绝对可靠的方法,但如果你在公共网站上公开数据,那么无论服务器还是客户端渲染,数据都已经被泄露了。


2
不,绝对不行。不要通过模糊不清来保障安全。 - Simon Arsenault
实际上,我认为乔在这里提出了一个很好的观点。基本上,到目前为止最好的解决方案就是干扰JSON数据源,以至于爬虫程序会不断地感到困惑。因此,可以插入虚假记录、无意义的标记,甚至在某些方面插入无效的JSON……这是可以做到的。只是感觉不是正确的方法……这将是那些越来越受欢迎的JS解决方案面临的真正挑战。 - jacekn
@jacekn 如果一个以爬取数据为生的人都对你的API感到困惑,那么想象一下你的团队会是什么样子。这可能需要额外几天的时间来研究这些东西,开发和维护它将花费多少钱? - Estus Flask
我们可以就这个问题进行辩论,但这不值得。基本上,乔说没有办法保护服务调用,只能干扰数据源。没有人提出任何关于真正的反爬保护的想法,所以我接受了乔的回答,并且没有采用 Angular。 - jacekn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接