• ajax跨站请求伪造


    用ajax提交数据到后台:

    {#<!DOCTYPE html>#}
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="/static/jquery-3.2.1.min.js"></script>
        <style>
            .sp{
                color: red;
            }
        </style>
    </head>
    <body>
    <p>姓名:<input type="text"></p>
    <p>密码:<input type="password"></p>
    <p>
        <button class="sub">提交</button><span class="sp"></span>
    </p>
    <script>
        function foo() {
                $(".sp").html("");
            }
        $(".sub").click(function () {
            $.ajax({
                url: "/demo_ajax/",
                type: "POST",
                data: {
                    username: $(":text").val(),
                    password: $(":password").val()
                },
                success: function (data) {
                    var data = JSON.parse(data);
                    if (!data["flag"]){
                        $(".sp").html("用户名或密码错误"),
                        setTimeout(foo,3000)
                    }
                }
            })
        })
    </script>
    </body>
    </html>
    

     前端采取这种方式提交会报forbidden的错误是因为没有加csrf_token,可是这个不是采用form表单的方式提交的:

    怎么解决这种问题呢?一般来说解决这种问题的办法有三种,下边就说一下这三种方式都怎么用:

    方式一:

    在提交ajax请求的时候给他事先设置一个值:
    function foo() {
                $(".sp").html("");
            }
        $(".sub").click(function () {
    #######################################
            $.ajaxSetup({
                data: {csrfmiddlewaretoken: '{{ csrf_token }}'}
            });
    #######################################
            $.ajax({
                url: "/demo_ajax/",
                type: "POST",
                data: {
                    username: $(":text").val(),
                    password: $(":password").val()
                },
                success: function (data) {
                    var data = JSON.parse(data);
                    if (!data["flag"]){
                        $(".sp").html("用户名或密码错误"),
                        setTimeout(foo,3000)
                    }
                }
            })
        })
    

    方式二:

    body部分:
    <form action="">
    {% csrf_token %}
    <p>姓名:<input type="text"></p>
    <p>密码:<input type="password"></p>
    </form>
    <p>
        <button class="sub">提交</button><span class="sp"></span>
    </p>
    button要写在外边,否则会默认以get提交
    ----------------------------------------------------------------------------------------
    这里是js代码:
        function foo() {
            $(".sp").html("");
        }
        $(".sub").click(function () {
            $.ajax({
                url: "/demo_ajax/",
                type: "POST",
                data: {
                    username: $(":text").val(),
                    password: $(":password").val(),
                    csrfmiddlewaretoken:$("[name='csrfmiddlewaretoken']").val(),
                },
                success: function (data) {
                    var data = JSON.parse(data);
                    if (!data["flag"]){
                        $(".sp").html("用户名或密码错误"),
                        setTimeout(foo,3000)
                    }
                }
            })
        })
    

    方式三:

            function foo() {
            $(".sp").html("");
        }
        $(".sub").click(function () {
            $.ajax({
                url: "/demo_ajax/",
                type: "POST",
                headers:{"X-CSRFToken":$.cookie('csrftoken')},
                data: {
                    username: $(":text").val(),
                    password: $(":password").val()
                },
                success: function (data) {
                    var data = JSON.parse(data);
                    if (!data["flag"]){
                        $(".sp").html("用户名或密码错误"),
                        setTimeout(foo,3000)
                    }
                }
            })
        })
    

    方式三可以在form表单提交,也可以不在form表单中提交:

     
  • 相关阅读:
    KISSY 1.3.0 发布,淘宝 Web UI 库
    mongodb的监控与性能优化
    Aspose.Tasks 4.9.0 发布,Project 文件读写
    Fix8 0.6.6 发布,C++ 实现的 FIX 框架
    VIM Pal 1.1.0 发布,VIM 文件树列表
    QT 5.0 正式版发布,支持 C++11
    TWiki 5.1.3 发布,企业 Wiki 系统
    Apache Lucene 3.6.2 发布
    Apache Sqoop 1.99.1 发布
    JAXX 2.5.9 发布,XML用户界面框架
  • 原文地址:https://www.cnblogs.com/gaidy/p/11696425.html
Copyright © 2020-2023  润新知