Django查看安全性和最佳实践

Mri*_*lla 5 python security django django-views

我最近开始研究Django,现在我的应用程序即将完成,我开始怀疑安全性和最佳实践.

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

  1. 我在每个视图之前放置了@login_required装饰器,因为我不希望任何人在未经过身份验证的情况下访问它们.这个可以吗?

  2. 在delete_employee和update_employee视图中,我只响应请求,如果它是AJAX POST请求(uisng is_ajax()).这个可以吗?

  3. 当视图成功执行所需操作时返回"成功",当表单中存在验证错误时返回错误但我仍然没有处理其他异常.我该怎么做?我应该通过像Ajax响应返回标准500页通过用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')
Run Code Online (Sandbox Code Playgroud)

谢谢.

Kil*_*nDS 11

好吧,我建议您不要只使用@login_required,而是要查看权限框架和相关权限所需的装饰器.这样,您可以在用户或组的基础上微调访问限制.之后使用权限更改用户行为比仅使用login_required装饰器更容易,更安全.假设您现在只有管理员,但稍后您想要添加其他类型的用户,那么很容易错过login_required装饰器然后授予这些用户访问管理员视图的权限.正确定义的权限不会出现此问题.

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

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

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