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

时间:2011-05-23 00:36:38

标签: python google-app-engine rest restful-authentication tipfy

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

保护这些来电的最佳(或标准)方式是什么?如果我打算在未来发布API,或者我将两个不同的策略混合在一起,是否值得查看OAuth之类的内容?一起?

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

3 个答案:

答案 0 :(得分:6)

绝对看看OAuth

它很快成为保护REST API的“事实上”标准,很多大公司都在使用它,包括GoogleTwitterFacebook只是为了命名少。

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

最简单的方法(恕我直言)在BitBucket上使用David Larlet的OAuth Support in Django库。

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

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

答案 1 :(得分:4)

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

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

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

您可以采取一些措施来缓解 API抓取:

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

答案 2 :(得分:1)

OAuth在您当前的方案(potentially insecure)中会有些过分,因为它旨在授权第三方服务根据用户的行为访问资源。

通过授权用户保护AJAX请求

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

因此,请使用Tipfy的auth extension来保护您的网址:

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 extension,但它不是AJAX。相反,session extension可用于对所有呼叫应用“authenticity_token”,需要在服务器上进行验证。