我有一个具有“私有”REST API 的应用程序;从我自己的网页进行 Ajax 调用时,我使用 RESTful URL。但是,这是不安全的,任何人只要知道 URL 模式就可以进行同样的调用。
保护这些呼叫的最佳(或标准)方法是什么?如果我打算在未来发布 API,是否值得现在看看像 OAuth 之类的东西,或者我是否将两种不同的策略混合在一起?
我正在使用适用于 Python 和 Tipfy 的 Google App Engine。
我有一个具有“私有”REST API 的应用程序;从我自己的网页进行 Ajax 调用时,我使用 RESTful URL。但是,这是不安全的,任何人只要知道 URL 模式就可以进行同样的调用。
保护这些呼叫的最佳(或标准)方法是什么?如果我打算在未来发布 API,是否值得现在看看像 OAuth 之类的东西,或者我是否将两种不同的策略混合在一起?
我正在使用适用于 Python 和 Tipfy 的 Google App Engine。
一定要看看OAuth
它正在迅速成为保护 REST API 的“事实上的”标准,许多大公司都在使用它,包括Google、Twitter和Facebook等等。
对于 GAE 上的 Python,您有两种选择:
最直接的方法(恕我直言)是在 BitBucket 上使用 David Larlet 的库来支持 Django 中的 OAuth 支持。
但是由于您没有使用 Django,也许您想看看 GitHub 上提供的python-oauth2库,它被认为是 Python 2.4+ 的 OAuth 的最新且经过单元测试的实现。
无论哪种方式,我认为使用 OAuth 比推出自己的服务安全解决方案要好得多。
保护 javascript 客户端几乎是不可能的;在服务器上,您没有万无一失的方法来区分使用 Web 浏览器的人和精心设计的脚本。
SSL 通过网络加密数据,但在边缘解密,所以这无济于事。它可以防止中间人攻击,但不会验证原始客户端的合法性。
OAuth 有利于保护两台服务器之间的请求,但对于 Javascript 客户端,它并没有真正的帮助:任何阅读您的 javascript 代码的人都可以找到您的使用者密钥/秘密,然后他们可以伪造签名请求。
您可以采取一些措施来减轻API 抓取:
OAuth 在您当前的场景中将是过度杀伤(可能不安全),因为它旨在授权第三方服务访问用户行为的资源。
AFAICT,您可以控制客户端、资源和身份验证;因此,您只需要保护对 URL 的访问,并可能通过 SSL [2] 保护客户端和服务器之间的通信。
因此,请使用 Tipfy 的身份验证扩展来保护您的 URL:
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.')
如果用户未知,则可以应用 CSRF 预防措施来帮助保护 REST 服务不被“未经授权”的客户端调用。Tipfy 在它的WTForms 扩展中内置了这个,但它不是 AJAX。相反,会话扩展可用于将“authenticity_token”应用于所有需要在服务器上验证的调用。