Django 视图安全与最佳实践

5

我最近开始使用Django,现在我的应用即将完成,我开始思考安全性和最佳实践。

我有一个视图生成页面,并且页面上的不同函数通过传递post请求到各自的视图来进行操作。例如,我有一个名为show_employees的视图,可以通过将post请求传递到delete_employee和update_employee视图来删除和更新员工。

  1. 我在每个这些视图之前放置了@login_required装饰器,因为我不希望未经认证的用户访问它们。这样做是否可以?

  2. 在delete_employee和update_employee视图中,我只响应AJAX POST请求(使用is_ajax())。这样做是否可以?

  3. 当视图成功执行所需操作时,我返回“success”,当表单存在验证错误时则返回“error”,但我仍未处理其他异常。我该如何处理?我应该返回标准的500页通过一个AJAX响应像这样,通过try-except块包装视图以处理所有异常吗?

  4. 还有其他方法来保护我的视图吗?

这是我的一个示例视图:

    @login_required
    def add_site(request):
        data = {}
        if request.method == 'POST':
            if request.is_ajax():
                form = AddSiteForm(request.user, request.POST)
                if form.is_valid():
                    site = form.save(commit=False)
                    site.user = request.user
                    site.save()
                    data['status'] = 'success'
                    data['html'] = render_to_string('site.html', locals(), context_instance=RequestContext(request))
                    return HttpResponse(simplejson.dumps(data), mimetype='application/json')
                else:
                    data['status'] = 'error'
                    data['errors'] = {}
                    for field, error in form.errors.iteritems():
                        data['errors']['id_'+field] = strip_tags(unicode(error))
                    return HttpResponse(simplejson.dumps(data), mimetype='application/json')

感谢您的信任。
1个回答

11

建议您不仅使用@login_required,还应查看权限框架和相关的permission required decorator。这样您就可以根据用户或组细粒度地调整访问限制。与使用仅@login_required装饰器相比,使用权限更容易且更安全地在以后更改用户行为。例如现在只有管理员,但是以后想要添加其他类型的用户,则容易忘记添加@login_required装饰器并授予这些用户对管理员视图的访问权限。如果定义了适当的权限,则不会出现此问题。

接下来,is_ajax只检查HTTP_X_REQUESTED_WITH标头。这与安全性实际上没有关系,而与用户友好行为有关。这样可以防止普通用户意外在浏览器中打开该页面并获得一些奇怪的数据。它对安全性没有任何帮助,因为每个合格的黑客都可以设置额外的HTTP标头 :)

不处理异常可能存在潜在危险,如果您不小心启用了DEBUG=True,那么Django将提供代码片段和回溯,可能会暴露漏洞。但是,如果关闭此选项,Django将显示自己的500错误页面。我的建议是:查找所有预期的Django异常(不多),并确保正确处理它们。此外,我会说,让其他异常由Django处理,Django仍然提供生成回溯和其他调试信息的可能性,并将这些信息发送给管理员,而不是在网站上显示它们。如果捕获了所有意外错误,则此行为将不直接可用,可能使您无法知道失败的代码。

最后,由于您正在使用用户输入数据,建议您查看django书中的安全章节,该章节解释了django框架中最重要的威胁以及如何处理它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接