这种观点存在安全风险吗?

时间:2013-10-16 11:00:40

标签: django django-views django-testing

Django文档似乎非常明确,必须重定向POST。我是所有这一切的新手,当我部署时,我并不急于被黑客攻击。我的问题是:以下观点是否可以利用?我在post.cleaned_data有效时重定向。当无效时我是否还需要重定向?另外,像这样的“递归”视图是否包含任何安全漏洞?

def detail(request, blog_id):
    b = get_object_or_404(Blog, pk=blog_id)
    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
            poster = form.cleaned_data['poster']
            comment = form.cleaned_data['comment']
            comment_date = timezone.now()
            b.comment_set.create(poster=poster, comment_date=comment_date, comment=comment)
            return HttpResponseRedirect(reverse('blog:detail', args=(b.id,)))
        else:
            return render(request, 'blog/detail.html', {
                'blog': b,
                'form': form,
                })
    form = CommentForm()
    return render(request, 'blog/detail.html', {
            'blog': b,
            'form': form,
        })

此外,对于那些有测试经验的人,您是否介意描述我应该采取哪些步骤来全面测试此视图?我知道如何测试状态代码。我还测试了post方法,并想知道如何查看整个重定向链(例如,post被调用,并返回一个HttpResponseRedirect但self.client.post停在那里,我想继续下一个调用它在视图末尾以递归方式返回get请求。感谢您提前输入。

2 个答案:

答案 0 :(得分:2)

成功帖子后重定向不是特定于Django的 - 对于任何语言/技术的任何Web应用程序来说,它都只是GoodPractice。这里没有太多的“安全”问题,你只是想避免用户在刷新页面时反复发布相同的内容。

原样,你的视图几乎是规范的edit_or_create视图 - 参见mariodev改进代码布局的答案,但是来自纯粹功能性的POV,这是完全相同的。

如何测试重定向等已完整记录。

答案 1 :(得分:0)

当表单无效时,你需要再次渲染视图,当你传递相同的表单对象时,它会自动显示错误,所以在这种情况下没有重定向,这就是你如何使你的视图更干净:

def detail(request, blog_id):
    b = get_object_or_404(Blog, pk=blog_id)

    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
            poster = form.cleaned_data['poster']
            comment = form.cleaned_data['comment']
            comment_date = timezone.now()
            b.comment_set.create(poster=poster, comment_date=comment_date, comment=comment)
            return HttpResponseRedirect(reverse('blog:detail', args=(b.id,)))
    else:
        form = CommentForm()

    return render(request, 'blog/detail.html', {
            'blog': b,
            'form': form,
        })

关于测试,要进行重定向,需要在post方法中添加follow参数(默认情况下设置为False):

c.post('/login/', {'name': 'fred', 'passwd': 'secret'}, follow=True)