Has*_*tax 5 django rest api-design django-views django-rest-framework
使用if request.method=='POST':或启动每个视图函数是否有好处if request.method=='GET':?或者我只是添加不必要的代码行?
我已经按照一些例子说明了Ajax的视图都在检查HTTP是否是用GET创建的.
例如,它可以阻止DDOS锁定到POST方法并使用GET进行锤击吗?或者,更实际的是,防止API消费者在PUT或POST时错误地进行补丁?
def employee_delete(request, uid):
if request.method == 'DELETE':
def employee_detail(request, uid):
if request.method == 'GET':
def employee_create(request):
if request.method == 'POST':
def employee_update(request, uid):
if request.method == 'PUT':
Run Code Online (Sandbox Code Playgroud)
使用if启动每个视图函数是否有好处
request.method=='POST':
是的,即使你只支持一种方法,最好还是保护它.HTTP协议指定GET请求不应该有副作用(计算访问者意义上的好处可能没有问题,但是严格来说,不会改变业务逻辑的"实体"的东西是不可接受的).
现在,"网络爬虫"(例如,通过搜索引擎或刮削器使用)通常检测页面上的链接,并就这些链接GET请求(因为他们的目标是"发现"新页).如果此URL后面有一个视图,例如,删除一名员工,则可能会发生意外 "网络爬虫"将编辑您的数据库.
其它方法,如GET,HEAD,PUT和DELETE应幂等的(这意味着使得相同的请求两次,应该具有相同的副作用,如发出请求仅一次).
因此,如果不"保护"您的观点,您将失去一层"保护",防止意外滥用您的网络服务器.
黑客还可以使用另一种方法进行请求,并查看服务器如何在搜索中响应以查找漏洞:例如,查看服务器是否对执行DELETE请求时失败的方法做出某些假设.例如,处理所有的方法比较通用的视图实现,可能-如果不是守卫-无意中允许删除文件(比如你写一个通用的视图来创建和编辑内容可以通过使用被"误用"黑客DELETE请求父视图已实现,但不应支持该特定实体).
在早期,一些HTTP Web服务器例如在使用HEAD请求时没有检查身份验证.结果,黑客可以通过尝试几个HEAD请求"扫描"id空间,从而获得知识在数据库中填充了什么id.当然,在本身不漏多少数据,但它是可以被一个漏洞使用如黑客数据的第一步.
请注意,虽然Django 在使用(例如)基于类的视图时可以对此进行一些保护,但是人们可以只使用任何字符串来处理请求.所以一个人可以写作方法FOOBAR.如果视图例如指定if request.method == 'POST'了else:语句,则可以使用它来使用else非GET方法输入语句.
但无论用例如何,"更安全而不是抱歉",并且保护HTTP方法,只是要检查的一个方面.
话虽这么说,如果只允许一部分方法,你可以使用@require_http_methods[Django-doc]装饰器:
Run Code Online (Sandbox Code Playgroud)from django.views.decorators.http import require_http_methods @require_http_methods(["GET", "POST"]) def my_view(request): # I can assume now that only GET or POST requests make it this far # ... pass
因此,这个装饰器使得保护使用正确的方法更加优雅.
| 归档时间: |
|
| 查看次数: |
272 次 |
| 最近记录: |