Django有一个好处,用`method =='POST':`来检查每个视图

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)

Wil*_*sem 7

使用if启动每个视图函数是否有好处 request.method=='POST':

是的,即使你只支持一种方法,最好还是保护它.HTTP协议指定GET请求不应该有副作用(计算访问者意义上的好处可能没有问题,但是严格来说,不会改变业务逻辑的"实体"的东西是不可接受的).

现在,"网络爬虫"(例如,通过搜索引擎或刮削器使用)通常检测页面上的链接,并就这些链接GET请求(因为他们的目标是"发现"新页).如果此URL后面有一个视图,例如,删除一名员工,则可能会发生意外 "网络爬虫"将编辑您的数据库.

其它方法,如GET,HEAD,PUTDELETE幂等的(这意味着使得相同的请求两次,应该具有相同的副作用,如发出请求仅一次).

因此,如果不"保护"您的观点,您将失去一层"保护",防止意外滥用您的网络服务器.

黑客还可以使用另一种方法进行请求,并查看服务器如何在搜索中响应以查找漏洞:例如,查看服务器是否对执行DELETE请求时失败的方法做出某些假设.例如,处理所有的方法比较通用的视图实现,可能-如果不是守卫-无意中允许删除文件(比如你写一个通用的视图来创建和编辑内容可以通过使用被"误用"黑客DELETE请求父视图已实现,但不应支持该特定实体).

在早期,一些HTTP Web服务器例如在使用HEAD请求时没有检查身份验证.结果,黑客可以通过尝试几个HEAD请求"扫描"id空间,从而获得知识在数据库中填充了什么id.当然,在本身不漏多少数据,但它是可以被一个漏洞使用如黑客数据的第一步.

请注意,虽然Django 在使用(例如)基于类的视图时可以对此进行一些保护,但是人们可以只使用任何字符串来处理请求.所以一个人可以写作方法FOOBAR.如果视图例如指定if request.method == 'POST'else:语句,则可以使用它来使用else非GET方法输入语句.

但无论用例如何,"更安全而不是抱歉",并且保护HTTP方法,只是要检查的一个方面.

话虽这么说,如果只允许一部分方法,你可以使用@require_http_methods[Django-doc]装饰器:

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
Run Code Online (Sandbox Code Playgroud)

因此,这个装饰器使得保护使用正确的方法更加优雅.