CSRF相关

 CSRF原理

第一次获取页面的时候浏览器返回一个随机字符串,之后提交数据的时候需要把到这个字符串去提交,不然会报错
返回的时候还会把这个字符串放到cookie里面,
使用form提交时候:
{% csrf_token %}
b. 无CSRF时存在隐患

用户可以从其他网站提交表单到当前网站

c. Form提交(CSRF)

    <form action="/login/" method="POST">
        {% csrf_token %}
        {{ csrf_token }}
    <div><input type="text" name="username" placeholder="用户名"/> </div>
    <div><input type="password" name="pwd" placeholder="请输入密码"/> </div>
    <div><input type="checkbox" name="check" value="1"/> 一周之内免登陆</div>
    <div><input type="submit" value="提交"/> </div>
    <div><input  id="btn1" type="button" value="提交1"/> </div>
    </form>
View Code

d. Ajax提交(CSRF)

 1  <script src="/static/jquery.js"></script>
 2     <script src="/static/jquery.cookie.js"></script>
 3 <script>
 4         $(function(){
 5             $.ajaxSetup({
 6                 beforeSend: function(xhr,settings){
 7                     xhr.setRequestHeader('X-CSRFtoken', $.cookie('csrftoken'));
 8                 }
 9             });
10 
11             $('#btn1').click(function () {
12                 console.log($.cookie('csrftoken'));
13                 $.ajax({
14                     url: '/login/',
15                     type:"GET",
16                     data: {'user': 'root', 'pwd': '123'},
17                     // headers: {'X-CSRFtoken': $.cookie('csrftoken')},
18                     success:function(arg){
19 
20                     }
21                 })
22             });
23         })
24     </script>
View Code

CSRF请求头 X-CSRFToken
e.个别页面需要csrf验证的解决方法
django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。
全局:
  中间件 django.middleware.csrf.CsrfViewMiddleware
局部:
@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
注:from django.views.decorators.csrf import csrf_exempt,csrf_protect
ajax在setup里面加
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});

完整代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div style="width: 300px; margin: 100px auto;background-color: dodgerblue">
    <form action="/login/" method="POST">
        {% csrf_token %}
        {{ csrf_token }}
    <div><input type="text" name="username" placeholder="用户名"/> </div>
    <div><input type="password" name="pwd" placeholder="请输入密码"/> </div>
    <div><input type="checkbox" name="check" value="1"/> 一周之内免登陆</div>
    <div><input type="submit" value="提交"/> </div>
    <div><input  id="btn1" type="button" value="提交1"/> </div>
    </form>
</div>
    <script src="/static/jquery.js"></script>
    <script src="/static/jquery.cookie.js"></script>
<script>
        $(function(){
            $.ajaxSetup({
                beforeSend: function(xhr,settings){
                    xhr.setRequestHeader('X-CSRFtoken', $.cookie('csrftoken'));
                }
            });

            $('#btn1').click(function () {
                console.log($.cookie('csrftoken'));
                $.ajax({
                    url: '/login/',
                    type:"GET",
                    data: {'user': 'root', 'pwd': '123'},
                    // headers: {'X-CSRFtoken': $.cookie('csrftoken')},
                    success:function(arg){

                    }
                })
            });
        })
    </script>
</body>
</html>

  

posted @ 2018-05-06 18:05  梦中琴歌  阅读(202)  评论(0编辑  收藏  举报