如何保护我的OPEN API?

时间:2015-08-08 19:58:37

标签: ajax api rest security django-rest-framework

我有一个主持的API端点(通过Django Rest Framework构建),例如: - domain.com/api/fetch_all?start=0&end=50。这将以分页方式从数据库中获取所有结果。

现在我在网页上代表这些信息。它或多或少像一个开放的论坛,每个人都可以阅读数据,但只有一些人可以写。我正在通过访问上述端点的AJAX请求将此数据查看到网页上。例如: -

$.ajax({
    type:'get',
    contentType: 'application/json',
    url:'domain.com/api/fetch_all?start=0&end=50',
    cache : true,
    dataType:'json',
    success:function(data)
    {
        // presenting the information when the page loads.
    }
});

所以,我的任务是如何保护我的API,以便没有机器人可以访问我在论坛上呈现的数据。例如: - 如果任何代码/脚本试图访问我的API,它应该抛出403 Forbidden错误。

import requests

# this should return 403 error
response = requests.get('domain.com/api/fetch_all?start=0&end=50')

但是,如果我尝试通过浏览器AJAX请求获取此数据,它应该返回数据。如何确定请求是来自浏览器(人工处理)还是机器人?

PS:我无法在此处添加OAuth功能,因为我没有登录表单。

1 个答案:

答案 0 :(得分:0)

不可能以这种方式限制请求者,因为机器人总是可以添加标题来欺骗浏览器。您在客户端上执行的任何操作都可以被攻击者复制。无需auth,您可以做的最好的是速率限制 - 基于每个客户端跟踪请求,并且每个时间单位仅允许一定数量的请求。

部分功能的解决方案是查看User-Agent标头。这应该包括浏览器信息,可能会让你淘汰一些机器人,但不是全部甚至大部分机器人。