删除隐藏字段后,Django中的CSRF错误

时间:2011-10-12 22:11:44

标签: javascript django forms csrf

我有一些关于如何使用JavaScript删除所有隐藏字段的good advice on StackOverflow

提交表单会将用户发送到/submit,并调用submit_form视图。在我的views.py文件中,我定义了我的索引页面(带有表单),以及接收提交的页面(我的/index页面为我打印错误,但这不应该影响任何内容):

def index(request, error_message = ''):
    t = get_template('index.html')
    html = t.render(Context( { 'ERROR_MESSAGE': error_message } ))
    return HttpResponse(html)

def submit_form(request):
    # get the POST data out of request and do something
    pass

我已经能够通过将代码更改为:

来抑制错误
from django.contrib.csrf.middleware import csrf_exempt

@csrf_exempt
def submit_form(request):
    # get the POST data out of request and do something
    pass

这实际上会关闭submit_form函数的CSRF。但是,我确定这不是理想的修复方法(现在我不是在检查表格中的伪造品)。

我尝试了更复杂的修复,比如

  • 添加this code以立即遵循jQuery代码(从提交中删除隐藏字段)
init:function(){
var ac=this

    # advice from StackOverflow to remove hidden 
    # fields from POST submission

    jQuery(document).ready(function($){
        $("form").submit(function() {
        $(this).find(":hidden").remove();
    });

# AJAX CSRF code inserted here
    #...
}

我已经看过几个问题,询问这类事情(以及Django书中的参考资料),但没有看到简单明了的答案。例如 - 即使我要容忍发布我的csrf_token(我仍然知道这是一个坏主意),我仍然不清楚我是否应该在我的索引页面中呈现它(然后它将提交表单将有令牌)或我是否应该在我的submit_form代码中执行某些操作。 Django代码簿(上面链接)使用my_view作为呈现令牌的视图函数;这个名字不是很有帮助!

有没有人有一个CSRF工作的小例子(使用javascript修改表单)?我真的认为这对我和StackOverflow上的很多其他人都很有用。理想情况下,它会尽可能简单(两个视图:一个传递表单,另一个打印其内容)。

非常感谢你的帮助。


更新:即使我prefent the csrfmiddlewaretoken被删除,我仍然会收到此错误。当我*不进行任何JavaScript处理时,我的表单很好。我已经确认只有我的

有没有什么方法可以让CSRF看到某些表单元素被删除?我在QueryDict对象中找不到任何不同的东西(使用POST从表单发送数据)。

我真的很感激任何帮助!

1 个答案:

答案 0 :(得分:5)

问题是您删除了隐藏的CSRF字段,解决方案是不删除此字段,您可以使用jQuery选择器使其忽略该字段:not(input [name = csrfmiddlewaretoken])

顺便说一下,Django对发送到表单类的未知字段名称没有问题,它会很乐意忽略它们,因此删除隐藏字段的权衡非常小。