Django 查看安全性和最佳实践

Posted

技术标签:

【中文标题】Django 查看安全性和最佳实践【英文标题】:Django view security and best-practices 【发布时间】:2011-02-10 02:17:31 【问题描述】:

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

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

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

    在 delete_employee 和 update_employee 视图中,我仅在请求是 AJAX POST 请求时才响应请求(uisng is_ajax())。这样可以吗?

    当视图成功完成所需操作时,我返回“成功”,当我的表单中存在验证错误但我仍未处理其他异常时,我返回错误。我该怎么做?我是否应该通过像 this 这样的 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')

谢谢。

【问题讨论】:

【参考方案1】:

好吧,我建议你看看permissions framework 和相关的permission required decorator,而不是只使用@login_required。通过这种方式,您可以基于用户或组微调访问限制。之后使用权限更改用户行为也比仅使用 login_required 装饰器更容易、更安全。假设现在您只有管理员,但稍后您想添加其他类型的用户,那么很容易错过 login_required 装饰器并授予这些用户访问管理员视图的权限。正确定义的权限不会有这个问题。

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

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

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

【讨论】:

以上是关于Django 查看安全性和最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

对Kubernetes安全感兴趣?查看Ian Lewis的最佳实践幻灯片

在django上使用folium的最佳实践

使用 Gunicorn 运行 Django - 最佳实践

Django - 异常处理最佳实践和发送自定义错误消息 [关闭]

Django 动态设置基础设施和最佳实践

Django Rest Framework 和 Stripe,最佳实践?