1. 程式人生 > >Django框架學習筆記(22.CSRF原理簡單介紹)

Django框架學習筆記(22.CSRF原理簡單介紹)

前面我們寫Django的時候,都要在settings.py裡把CSRF註釋掉,這裡其實是Django提供的一層防護,防止提交的資料含有XSS攻擊,只有請求裡面含有CSRF令牌(隨機字串)才可以通過,否則會被禁止。這裡不註釋掉也可以寫:

<form action="/login/" method="POST">
{% csrf_token %}
    <input type="text" name="user"/>
    <input type="password" name="pwd"/>
    <input type="checkbox" name=
"rmb" value="1"/>一天內免登入 <input type="submit" value="登入"/> </form>

ajax方式(提前配置ajax):

<body>
<form action="/login/" method="POST">
{% csrf_token %}
    <input type="text" name="user"/>
    <input type="password" name="pwd"/>
    <input type="checkbox" name="rmb" 
value="1"/>一天內免登入 <input type="submit" value="登入"/> <input id="btn1" type="button" value="按鈕"/> <input id="btn2" type="button" value="按鈕"/> </form> <script src="/static/jquery-1.12.4.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 () { $.ajax({ url: '/login/', type: 'POST', data: {'user': 'root', 'pwd': '123'}, success:function(arg){ } }) }); $('#btn2').click(function () { $.ajax({ url: '/login/', type: 'POST', data: {'user': 'root', 'pwd': '123'}, success:function(arg){ } }) }) }) </script> </body>

views.py裡面也可以設定是否使用CSRF:

當全域性設定了CSRF時候,這樣可以取消:

from django.views.decorators.csrf import csrf_exempt, csrf_protect
@csrf_exempt
def index(request):
    if request.session.get('is_login', None):
        return render(request, 'index.html', {'username': request.session['username']})
    else:
        return HttpResponse('錯誤')

當全域性沒有設定CSRF時候,這樣可以新增:

from django.views.decorators.csrf import csrf_exempt, csrf_protect
@csrf_protect
def index(request):
    if request.session.get('is_login', None):
        return render(request, 'index.html', {'username': request.session['username']})
    else:
        return HttpResponse('錯誤')