1、簡介html
django爲用戶實現防止跨站請求僞造的功能,經過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成。而對於django中設置防跨站請求僞造功能有分爲全局和局部。python
全局:jquery
中間件 django.middleware.csrf.CsrfViewMiddlewareajax
局部:django
注: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>