gpt4 book ai didi

Django 使用 `method==' POST' :` 检查每个 View 是否有好处

转载 作者:行者123 更新时间:2023-12-04 17:30:12 26 4
gpt4 key购买 nike

使用 if request.method=='POST': 启动我的每一个 View 函数是否有好处?或 if request.method=='GET': ?还是我只是添加不必要的代码行?

我遵循了一些示例,其中 Ajax 的 View 都在检查 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':

最佳答案

Is there a benefit to starting every one of my view functions with if request.method=='POST':



,即使你只支持一种方法,也最好注意这一点。 HTTP 协议(protocol)规定 GET 请求不应该有副作用(在计算访问者的意义上的良好效果可能没有问题,但没有改变业务逻辑的“实体”的东西严格来说是 Not Acceptable )。

现在“网络爬虫”(例如由搜索引擎或抓取工具使用)通常会检测页面上的链接,并对这些链接发出 GET 请求(因为它们旨在“发现”新页面)。如果此 URL 后面有一个 View ,例如删除员工,则可能会发生“网络爬虫”意外编辑您的数据库的情况。

其他方法,如 GETHEADPUTDELETE 应该是幂等的(这意味着发出两次相同的请求,应该有相同的副作用,就像只发出一次请求一样)。

因此,如果不“保护”您的 View ,您就会失去一层“保护”,防止意外滥用您的网络服务器。

黑客还可以使用另一种方法发出请求,并查看服务器在搜索中如何响应以查找漏洞:例如,查看服务器是否对执行 DELETE 请求时失败的方法做出某些假设。例如,处理所有方法的相当通用的 View 实现,如果不加以保护,可能会无意中允许删除文件(例如,您编写通用 View 来创建和编辑内容可能会被黑客“滥用”使用 DELETE请求实现父 View ,但不应支持该特定实体)。

例如,在早期,一些 HTTP 网络服务器在使用 HEAD 请求时不会检查身份验证。结果,黑客可以通过尝试几个 HEAD 请求“扫描”id 空间,从而了解数据库中填充了哪些 id。当然,这本身并不会泄露太多数据,但它是一个漏洞,可以作为黑客入侵数据的第一步。

请注意,尽管 Django 在使用例如基于类的 View 时对此有一些保护,但人们可以只使用任何字符串来请求。所以一个人可以写成方法 FOOBAR 。例如,如果 View 指定 if request.method == 'POST'else: 语句,则可以使用它以非 GET 方法输入 else 语句。

但不管用例如何,“安全总比抱歉”,以及保护 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


因此,这个装饰器可以更优雅地保护使用正确的方法。

关于Django 使用 `method==' POST' :` 检查每个 View 是否有好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52460581/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com