Python Django查看安全性和最佳实践

Python Django查看安全性和最佳实践,python,django,security,django-views,Python,Django,Security,Django Views,我最近开始开发Django,现在我的应用程序即将完成,我开始思考安全性和最佳实践 我有一个生成页面的视图和页面中的不同函数,将AJAX请求发布到各个视图。例如,我有一个名为show_employee的视图,我可以通过向视图delete_employee和update_employee传递一个post请求来删除和更新员工 我将@login\u必需的装饰器放在每个视图之前,因为我不希望任何人在未经身份验证的情况下访问它们。这样行吗 在delete_employee和update_employee视图

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

我有一个生成页面的视图和页面中的不同函数,将AJAX请求发布到各个视图。例如,我有一个名为show_employee的视图,我可以通过向视图delete_employee和update_employee传递一个post请求来删除和更新员工

  • 我将@login\u必需的装饰器放在每个视图之前,因为我不希望任何人在未经身份验证的情况下访问它们。这样行吗

  • 在delete_employee和update_employee视图中,我仅在请求是AJAX POST请求时才响应请求(uisng是_AJAX())。这样行吗

  • 当视图成功执行所需操作时,我返回一个“success”,当表单中存在验证错误时,返回一个错误,但我仍然没有处理其他异常。我该怎么做?我是否应该通过AJAX响应返回标准的500页,比如用try-except块包装视图以处理所有异常

  • 我还能做些什么来保护我的视野吗

  • 以下是我的示例视图:

        @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')
    

    谢谢。

    好吧,我建议您不要只使用@login\u required,而是查看和关联的。这样,您可以根据用户或组微调访问限制。事后使用权限更改用户行为也比只使用登录所需的装饰器更容易、更安全。假设现在您只有管理员,但以后您想添加其他类型的用户,很容易错过登录所需的装饰程序,并授予这些用户访问管理员视图的权限。使用正确定义的权限不会出现此问题

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

    如果您不小心离开
    DEBUG=True
    ,不处理异常可能会有潜在的危险,在这种情况下,django将提供代码片段和回溯,可能会泄露弱点。但是,如果此选项处于关闭状态,django将显示它自己的500错误页面。我的建议是:寻找所有预期的django异常(不是那么多),并确保正确捕获这些异常。此外,我想说,让另一个异常由django处理,django仍将提供生成回溯和其他调试信息的可能性,并将这些信息发送给管理员,而不是在现场显示它们。如果捕获到所有意外错误,则此行为将无法直接使用,可能会使您对失败的代码一无所知

    最后,当您处理用户输入数据时,我建议您看看django书籍中的,它解释了最重要的威胁以及如何在django框架中处理它们