2010-04-20 80 views
5

我最近开始在Django上工作,现在我的应用即将完成,我开始怀疑安全和最佳做法。Django查看安全和最佳做法

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

  1. 我已经把@login_required装饰这些视图之前,因为我不希望任何人访问这些未经验证的情况做。这个可以吗?

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

  3. 当视图成功执行所需操作时会返回'成功',并且在表单中存在验证错误时出现错误,但我仍未处理其他异常。我应该怎么做?我应该通过一个AJAX响应返回标准500页面,如this,通过用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') 

谢谢。

回答

11

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

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

如果您不小心遗留在DEBUG=True上,则不会处理异常可能会带来潜在危险,在这种情况下,django将提供代码和回溯,可能会带来不足之处。但是,如果此选项关闭,django将显示它自己的500错误页面。我的建议是:寻找所有预期的Django异常(并不是那么多),并确保你正确地捕获这些异常。另外我会说,让另一个异常由django处理,django仍然会提供生成回溯和其他调试信息的可能性,并将这些信息发送给管理员,而不是在现场显示它们。如果您发现所有意外错误,则此行为将不会直接提供,可能会让您未知代码失败。

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