问题 如何保护我在应用程序中进行的REST调用?


我有一个具有“私有”REST API的应用程序;从我自己的网页进行Ajax调用时,我使用RESTful URL。但是,这是不安全的,如果他们知道URL模式,任何人都可以进行相同的调用。

保护这些电话的最佳(或标准)方法是什么? 如果我打算将来发布API,或者我将两个单独的策略混合在一起,是否值得看看OAuth之类的东西?

我正在使用Google App Engine for Python和Tipfy。


6956
2018-05-23 00:36


起源

谢谢大家的意见。我选择OAuth是因为它是标准的,现在和将来都会为我服务。 - Matt Norris


答案:


绝对看一看 OAuth的

它正在迅速成为保护REST API的“事实上”标准,许多大公司正在使用它,包括 谷歌推特 和 Facebook的 仅举几个。

对于GAE上的Python,您有两种选择:

最直接的方式(恕我直言)使用David Larlet的库 Django中的OAuth支持 在BitBucket上可用。

但既然你没有使用Django,也许你想看一下 蟒蛇-的oauth2 可以在GitHub上使用的库,被认为是Python 2.4+的最新和单元测试的OAuth实现。

无论哪种方式,我认为使用OAuth比使用自己的服务安全解决方案要好得多。


6
2018-05-23 01:30



如果您要使用OAuth,则应该使用OAuth 2.0 wiki.oauth.net/w/page/25236487/OAuth-2  - github.com/progrium/oauth2-appengine - Jason Hall
为什么要将OAuth从您自己的网页用于您自己的“私有”REST API? - Erick Fleming
@Erick网页是客户端,服务器是资源提供者。 - Will Curran


保护javascript客户端几乎是不可能的;在服务器上,您没有万无一失的方法来区分使用Web浏览器的人和精心设计的脚本。

SSL通过线路加密数据但在边缘解密,因此没有帮助。它可以防止中间人攻击,但无法验证原始客户端的合法性。

OAuth适用于保护两台服务器之间的请求,但对于Javascript客户端,它并没有真正帮助:阅读您的javascript代码的任何人都可以找到您的消费者密钥/秘密,然后他们可以伪造签名请求。

你可以做的一些事情 减轻 API抓取:

  • 当有人访问您的网站时,生成短期会话cookie。需要有效的会话cookie才能调用REST API。
  • 生成短期请求令牌并将其包含在您的网站HTML中;在每个API请求中需要一个有效的请求令牌。
  • 要求您网站的用户登录(Google帐户/ OpenID);在处理API请求之前检查auth cookie。
  • 速率限制API请求。如果您在短时间内看到来自一个客户端的过多请求,请阻止它们。

4
2018-05-23 14:04





OAuth在您当前的场景中会有些过分(可能不安全),因为它旨在授权第三方服务访问用户行为的资源。

通过授权用户保护AJAX请求

AFAICT,您可以控制客户端,资源和身份验证;所以你只需要通过SSL [2]来保护对URL的访问以及客户端和服务器之间的通信。

所以,使用Tipfy auth扩展 保护您的网址:

from tipfy import RequestHandler, Response
from tipfy.ext.auth import AppEngineAuthMixin, user_required

class MyHandler(RequestHandler, AppEngineAuthMixin):
    @user_required
    def get(self, **kwargs):
        return Response('Only logged in users can see this page.')

在没有授权用户的情况下保护AJAX请求

如果用户未知,则可以应用CSRF预防来帮助保护REST服务不被“未授权”客户端调用。 Tipfy内置了它 WTForms扩展,但这不是AJAX。相反, 会话扩展 可用于对所有需要在服务器上验证的调用应用“authenticity_token”。


1
2018-05-23 00:50



谢谢,埃里克。唯一的问题是,即使有人没有登录,我也需要使用Ajax。还有另一个来自Tipfy的装饰者能够达到这个目的吗? - Matt Norris
@Wraith,如何识别无效用户? - Erick Fleming
任何人都可以使用网站的基本功能,但有些功能受到限制。当需要有效的登录用户时,使用装饰器是明确的,但我仍然使用Ajax用于匿名用户。 - Matt Norris
我唯一能想到的是,在tipfy的会话扩展中使用“secret_key”功能来创建某种哈希验证,以确保调用来自您的AJAX应用程序。 - Erick Fleming