Python - Django大数据 爬虫Python AI SqlPython语言与信息数据获取和机器学习

Django - CSRF

2017-08-23  本文已影响12人  廖马儿

X-CSRF攻击。
黑客可以将被人的cookie拿走。
黑客可以用这个cookie来登录。

CSRF原理:
你们来我服务器请求,第一次请求来要数据,我不仅仅给你了数据,还给你了一个加密后的字符串。

其他的参考

需要怎么做:

settings.py中需要有 django.middleware.csrf.CsrfViewMiddleware 这个中间件
每次在模板里写 form 时都知道要加一个 {% csrf_token %} tag
每次发 ajax POST 请求,都需要加一个 X_CSRFTOKEN 的 header

我们不要吧settings.py中的中间件'django.middleware.csrf.CsrfViewMiddleware'注释掉,它是来保护我们的。

在模板中:

{{ csrf_token }}  # 这样就会显示它
{% csrf_token %}  # 不会显示,但是会存在于模板

后者会在html中生成一个隐藏的input框,type=hidden

在cookie中也生成了csrftoken。

图片.png

如果ajax发送的话,那么需要在cookie中取得到csrftoken,放在请求头再发过去。

1)form提交的时候,将csrf_token带过去:

<form action="/cookie/login/" method="post">
    {% csrf_token %}
    <input type="text" name="username">
    <input type="text" name="pwd">
    <input type="submit" value="提交">
</form>
</body>
</html>

2)如果ajax提交:

我们可以从上面的在cookie中也生成了csrftoken,取出然后传递过去。

示例:
js方式提交数据。

<body>


<form action="/cookie/login/" method="post">
    {% csrf_token %}
    <input type="text" name="username">
    <input type="text" name="pwd">
    <input type="submit" value="提交">
    <input id="btn" type="button" value="按钮">

</form>

<script src="/static/js/jquery.cookie.js"></script>
<script src="/static/js/jquery-2.1.4.min.js"></script>

<script>

    $(function(){
        $("#btn").click(function(){
            $.ajax({
                url:'/cookie/login/',
                type:"POST",
                data:{'user':'root', 'pwd':'123'},
                success:function(response){
                        
                }
            })
        })
    })

</script>

两种方式提交:

1)form 表单提交

 <form action="/cookie/login1/" method="post">
        {% csrf_token %}
        <input type="text" name="username">
        <input type="text" name="pwd">
        <input type="submit" value="add">
        <input id="btn" type="button" value="button-add">
    </form>

2)ajax提交

<script>

    $(function(){

        // ajax设置
        $.ajaxSetup({
            // 发送ajax之前,执行以下这个函数
            beforeSend:function(xhr, settings){  // xhr=XmlHttpRequest 对象,所有ajax请求底层操作都是使用的它来做的
                xhr.setRequestHeader('X-CSRFtoken', $.cookie('csrftoken'))
            }
        });

        // 添加点击事件
        $("#btn").click(function(){
            $.ajax({
                url:'/cookie/login1/',
                type:"POST",
                headers:{'X-CSRFtoken':$.cookie('csrftoken')},
                data:{'username':'root', 'pwd':'123'},
                success:function(response){

                }
            })
        })
    })

</script>

部分函数不需要CSRF或者说部分函数需要CSRF的处理方法

1)通过装饰器csrf_protectcsrf_exempt来进行

from django.views.decorators.csrf import csrf_protect, csrf_exempt

@csrf_exempt  # 不需要csrf认证
def me1(request):
    pass 

@csrf_protect  # 需要csrf认证
def me2(request):
    pass 

2)通过通过请求方式来区分加还是不加csrf

图片.png
上一篇下一篇

猜你喜欢

热点阅读