我最近开始研究Django,现在我的应用程序即将完成,我开始怀疑安全性和最佳实践。
我有一个视图,在页面中生成一个页面和不同的函数,发布AJAX请求到单个视图。例如,我有一个名为show_employees的视图,我可以通过将一个post请求传递给视图delete_employee和update_employee来删除和更新员工。
我在每个视图之前放置了@login_required装饰器,因为我不希望任何人在未经过身份验证的情况下访问它们。这没关系吗?
在delete_employee和update_employee视图中,我只响应请求,如果它是AJAX POST请求(uisng is_ajax())。这没关系吗?
当视图成功执行所需操作时返回'success',当我的表单中存在Validation错误时返回错误但我仍然没有处理其他异常。我该怎么做?我应该通过包含try-except块的视图来处理所有异常,通过像this这样的AJAX响应返回标准500页吗?
我能做些什么来保护我的观点?
以下是我的示例视图:
@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')
谢谢。
答案 0 :(得分: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框架中处理它们。