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