Django之cfrs跨站請求僞造和xfs攻擊

跨站請求僞造

1、簡介html

django爲用戶實現防止跨站請求僞造的功能,經過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成。而對於django中設置防跨站請求僞造功能有分爲全局和局部。python

全局:jquery

  中間件 django.middleware.csrf.CsrfViewMiddlewareajax

局部:django

  • @csrf_protect,爲當前函數強制設置防跨站請求僞造功能,即使settings中沒有設置全局中間件。
  • @csrf_exempt,取消當前函數防跨站請求僞造功能,即使settings中設置了全局中間件。

注:from django.views.decorators.csrf import csrf_exempt,csrf_protectcookie

csrf:跨站請求僞造(生成隨機字符串),每次操做訪問時則檢查隨機的字符串
csrf:post時,須要用戶攜帶隨機字符串閉包

2、應用app

一、普通表單xss

veiw中設置返回值:
  return render_to_response('Account/Login.html',data,context_instance=RequestContext(request))  
     或者
     return render(request, 'xxx.html', data)
  
html中設置Token:
  {% csrf_token %}

  

二、Ajax函數

對於傳統的form,能夠經過表單的方式將token再次發送到服務端,而對於ajax的話,使用以下方式。

 

示例:

urls.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views


urlpatterns = [
    url(r'^admin/', admin.site.urls),

    # 關於csrf:跨站請求僞造(生成隨機字符串),每次操做訪問時則檢查隨機的字符串
    url(r'^csrf1.html$',views.csrf1),

]

views.py

from django.shortcuts import render,HttpResponse from django.views import View from app01 import models from django.views.decorators.csrf import csrf_exempt,csrf_protect # =============關於csrf的: # csrf:跨站請求僞造(生成隨機字符串),每次操做訪問時則檢查隨機的字符串 # 1.將setting裏面的csrf的註釋去掉
@csrf_protect#這個指的是局部使用,全站禁用,(僅僅在下面的這個被裝飾的函數使用csrf)須要註釋setting裏的csrf
@csrf_exempt#這個指的是局部禁用,全站使用,(僅僅在下面的這個被裝飾的函數禁用csrf)不能註釋setting裏的csrf
def csrf1(request): if request.method=="GET": return render(request,"csrf1.html") else: return HttpResponse("good")

csrf1.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form method="post" action="/csrf1.html">
    {% csrf_token %}
{#    {{ csrf_token }}#}
    <input id="user" type="text" name="username">
    <input type="submit" value="提交">
    <a onclick="submitForm();">Ajax提交</a>
</form>

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

<script>
    function submitForm() {
        var token=$.cookie("csrftoken");
{#        var token=$.cookie("csrftoken");這個根據cookie的key來取的隨機生成的cookie的value值#}
        var user=$("#user").val();
        $.ajax({
            url:"/csrf.html",
            type:"POST",
            headers:{"X-CSEFToken":token},
            data:{"user":user},
            success:function (arg) {
                console.log(arg);
            }
        })

    }
</script>

</body>
</html>

 

3、csrf基於FBV和CBV的應用

示例:

from django.shortcuts import render,HttpResponse
from django.views import View
from app01 import models
from django.views.decorators.csrf import csrf_exempt,csrf_protect
# =======csrf裏面的CBV(基於類的方式)應用裝飾器
from django.views import View
from django.utils.decorators import method_decorator
# 一、先自定義一個閉包函數作裝飾器
def wrapper(func):
    def inner(*args,**kwargs):
        return func(*args,**kwargs)
    return inner
# 關於cbv的應用裝飾器,方法一:在指定的方法上添加裝飾器
class Foo(View):
    @method_decorator(wrapper)#僅僅在下面的函數內有效
    def get(self,request):
        # return HttpResponse("login_get")
        return render(request,"login.html")

    def post(self,request):
        print(request.POST.get("username"))
        return HttpResponse("login_post")

# 方法二:在類上面添加
# @method_decorator(wrapper,name="get")#僅僅給類裏面的get函數使用
@method_decorator(wrapper,name="dispatch")#給下面全部的函數使用
class Foo(View):
    def dispatch(self, request, *args, **kwargs):
        pass
    def get(self,request):
        # return HttpResponse("login_get")
        return render(request,"login.html")

    def post(self,request):
        print(request.POST.get("username"))
        return HttpResponse("login_post")

  

xss攻擊

- 慎用 safe和mark_safe
- 非要用,必定要過濾關鍵字

示例:

xss攻擊
    跨站腳本攻擊:
    防止:
        -其餘人輸入的內容  不用safe
        -本身輸入的內容    可用safe
 
 
    <scripts>
        for(var i=0;i<9999;i++){
            alert(i)
        }
    </scripts>   
             
    <scripts>
        獲取本地cookie,發送到別外一個網站
    </scripts>    
相關文章
相關標籤/搜索