我有一个主持的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功能,因为我没有登录表单。
答案 0 :(得分:0)
不可能以这种方式限制请求者,因为机器人总是可以添加标题来欺骗浏览器。您在客户端上执行的任何操作都可以被攻击者复制。无需auth,您可以做的最好的是速率限制 - 基于每个客户端跟踪请求,并且每个时间单位仅允许一定数量的请求。
部分功能的解决方案是查看User-Agent
标头。这应该包括浏览器信息,可能会让你淘汰一些机器人,但不是全部甚至大部分机器人。