代码之家  ›  专栏  ›  技术社区  ›  Kermit

Django用'method=='POST'检查每个视图有什么好处吗:`

  •  5
  • Kermit  · 技术社区  · 8 年前

    启动每个视图函数有什么好处吗 if request.method=='POST': 或 if request.method=='GET': ? 或者我只是在添加不必要的代码行?

    例如,它能阻止DDOS锁定到POST方法并用GETs攻击它吗?或者,更实际地说,防止API使用者在应该放置或发布时错误地进行修补?

    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':
    
    2 回复  |  直到 8 年前
        1
  •  7
  •   c6754    8 年前

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

    是的

    现在“网络爬虫”(例如搜索引擎或scraper使用的)通常会检测页面上的链接,并对这些链接发出GET请求(因为它们的目标是“发现”新页面)。例如,如果此URL后面有一个视图删除了一名员工,则可能会发生以下情况: 一个“网络爬虫”将编辑你的数据库。

    其他方法如 GET HEAD , PUT 和 DELETE 应该是 (这意味着两次提出同样的请求,其副作用应该与只提出一次请求相同)。

    因此,如果不“保护”您的视图,您就失去了一层“保护”来防止意外误用您的Web服务器。

    删除

    例如,在早期,一些HTTP web服务器在使用HEAD请求时没有检查身份验证。因此,黑客可以通过尝试几个HEAD请求来“扫描”id空间,从而获得数据库中填写的id。当然,这本身不会泄露 但这是一个可以 习惯于

    注意,虽然Django 一些 在使用基于类的视图时,用户可以使用 任何 请求的字符串。所以一个人可以写为方法 FOOBAR . 例如,如果视图指定 if request.method == 'POST' else: 语句,因此可以使用它来输入 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

        2
  •  2
  •   solarissmoke    8 年前

    例如泛型 CreateView 已经提供了所有限制HTTP请求类型的内置逻辑。它允许您执行GET请求来初始化表单,但需要POST请求来处理数据。因此,您不会意外地触发通过GET请求保存的数据。

    UpdateView , DetailView

    所有基于Django类的视图都带有 http_method_names

    from django.views.generic import View
    
    class MyView(View):
    
        # only GET and POST allowed. Anything else will get a 405 Method Not Allowed response.
        http_method_names = ['get', 'post']
    
        def get(self, request, *args, **kwargs):
            # Logic for GET requests goes here.
    
        def post(self, request, *args, **kwargs):
            # Logic for POST requests goes here. No risk of it getting mixed up with GET.
    

    除了为表单处理、模板加载等提供许多其他帮助外,过程视图还可以 一开始比较简单,但您很快就会意识到,为了让他们做您需要的事情,您必须编写更多的代码。