我有一个具有“私有”REST API的应用程序;从我自己的网页进行Ajax调用时,我使用RESTful URL。但是,这是不安全的,如果他们知道URL模式,任何人都可以进行相同的调用。
保护这些来电的最佳(或标准)方式是什么?如果我打算在未来发布API,或者我将两个不同的策略混合在一起,是否值得查看OAuth之类的内容?一起?
我正在使用Google App Engine for Python和Tipfy。
答案 0 :(得分:6)
绝对看看OAuth
它很快成为保护REST API的“事实上”标准,很多大公司都在使用它,包括Google,Twitter和Facebook只是为了命名少。
对于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抓取:
答案 2 :(得分:1)
OAuth在您当前的方案(potentially insecure)中会有些过分,因为它旨在授权第三方服务根据用户的行为访问资源。
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.')
如果用户未知,则可以应用CSRF预防来帮助保护REST服务不被“未授权”客户端调用。 Tipfy内置了它WTForms extension,但它不是AJAX。相反,session extension可用于对所有呼叫应用“authenticity_token”,需要在服务器上进行验证。