【问题标题】:CSRF error in Django after removal of hidden fields删除隐藏字段后 Django 中的 CSRF 错误
【发布时间】:2011-12-06 12:39:34
【问题描述】:

我收到了一些关于如何使用 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 从表单中发送数据)中找不到任何不同之处。

非常感谢任何帮助!

【问题讨论】:

    标签: javascript django forms csrf


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      • 2014-05-13
      • 1970-01-01
      • 2019-01-11
      • 2021-02-08
      • 2018-08-21
      相关资源
      最近更新 更多