当前位置: 首页 > 知识库问答 >
问题:

如何添加Django的CSRF令牌到jQuery POST请求的头?

祁俊拔
2023-03-14

我试图创建一个带有动态预填充字段的Django表单:也就是说,当从下拉菜单中选择一个字段(checkin\u type)时,其他字段会自动预填充相应的数据。为此,我希望在选择下拉选项后立即向服务器发送POST请求。

到目前为止,我已经尝试了以下模板(以下html" target="_blank">https://docs.djangoproject.com/en/2.0/ref/csrf/):

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js"></script>
<script>
    $(document).ready(function(){
        var csrftoken = Cookies.get('csrftoken');

        $(".auto-submit").change(function() {
            $.post({
                url: "{% url 'get-checkin-type' %}",
                data: $(".auto-submit option:selected").val(),
                headers: {
                    X-CSRFToken: csrftoken
                }
            })
        });
    });
</script>


<form action="" method="post">{% csrf_token %}
    {% for field in form %}
        <div class="{% if field.name == 'checkin_type' %}auto-submit{% endif %}">
            {{ field.errors }}
            {{ field.label_tag }}
            {{ field }}
        </div>
    {% endfor %}
    <input type="submit" value="Send message" />
</form>

但是,当我选择一个下拉选项时,我会得到一个

新:17未捕获的语法错误:意外标记-

X-CSRFToken:CSRFToken行发出:

有人能告诉我这个代码有什么问题吗?(我试着从https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Unexpected_token查找,但到目前为止还没弄清楚)。

顺便说一下,从jQuery将CSRF令牌添加到所有$. post()请求的数据中,似乎也可以将CSRF令牌添加到POST请求的data中,但对我来说,这似乎不是最优雅的方法,文档状态那个啊

为此,有一种替代方法:在每个XMLHttpRequest上,将自定义的X-CSRFToken标头设置为CSRF令牌的值。

共有2个答案

洪胤
2023-03-14

PSK的解决方案是可行的,但为了完整起见,这里是Django文档在进一步阅读(从https://docs.djangoproject.com/en/2.0/ref/csrf/#setting-ajax请求上的令牌),它使用。ajaxSetup一次性覆盖所有请求:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js"></script>
<script>
    $(document).ready(function(){
        var csrftoken = Cookies.get('csrftoken');

        function csrfSafeMethod(method) {
            // these HTTP methods do not require CSRF protection
            return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
        }
        $.ajaxSetup({
            beforeSend: function(xhr, settings) {
                if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                    xhr.setRequestHeader("X-CSRFToken", csrftoken);
                }
            }
        });

        $(".auto-submit").change(function() {
            $.post({
                url: "{% url 'get-checkin-type' %}",
                data: $(".auto-submit option:selected").val(),
            })
        });
    });
</script>
姚乐家
2023-03-14

您缺少单个报价,请尝试以下操作。

$(".auto-submit").change(function() {
    $.post({
        url: "{% url 'get-checkin-type' %}",
        data: $(".auto-submit option:selected").val(),
        headers: {
            'X-CSRFToken': csrftoken
        }
    })
});
 类似资料:
  • 问题内容: 我正在使用Laravel 5应用程序,该应用程序默认为所有POST请求启用CSRF保护。我喜欢这种增加的安全性,因此我正在尝试使用它。 发出简单请求时,我收到一个错误,因为POST数据中缺少所需的表单输入。这是一个有关$ .post请求的示例: 我将CSRF令牌存储为标头中的meta字段,可以使用以下命令轻松访问它: 是否可以在所有传出请求中将其附加到json数据?我尝试使用标头,但L

  • 我正在使用Amazon SNS在我的HTTP/HTTPSendpoint上接收推送消息。endpoint应用程序是用Django编写的。要在endpoint(web app)上接收通知,HTTP/HTTPSendpoint需要订阅一个主题。 我的问题是当Amzaon SNS发送订阅确认时,它如何在POST请求中发送CSRF令牌,以便我处理请求并检索所需信息? 文档:http://docs.aws.

  • 我遇到了CodeIgniter/CSRF/JSON的问题。 我正在向PHP后端发送内容类型为“application/json”的http POST请求。有效负载是json数据。我将与数据一起传递生成并存储在CSRF cookie中的CSRF令牌。对于标准POST表单请求,它工作正常,但作为json发送时失败。 由于$\u POST数组因JSON内容类型而为空,CodeIgniter无法验证coo

  • 问题内容: 我有使用mod_wsgi在apache服务器上运行的django,以及由apache(而不是django)直接提供服务的angularjs应用。我想对django服务器进行POST调用(运行rest_framework),但csrf令牌存在问题。 是否可以通过某种方式从服务器设置令牌而不将其作为模板的一部分放置(因为这些页面没有经过django)? 我希望能够通过GET请求以cooki

  • 概述 我将使用API网关作为基于Spring Security性的身份验证。我刚刚按照https://spring.io/guides/tutorials/spring-security-and-angular-js/链接中的步骤创建了一个基于其对应的github项目的“对双”模块的项目https://github.com/spring-guides/tut-spring-security-and

  • 我在Spring5(Boot2)RESTful web服务中配置了CSRF保护,因为我希望防止CSRF攻击(我使用cookie进行身份验证和授权)。在每个请求中,我都会得到一个新的cookie。我通过标头发回的cookie的值。 我注意到、和方法需要此标记的值(在标头中)才能正常工作,但是方法没有标头也可以正常工作。 这种行为是故意的,因为方法不应该改变状态,还是我做错了什么?