跨站请求伪造
一、简介
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
csrf:跨站请求伪造(生成随机字符串),每次操作访问时则检查随机的字符串
csrf:post时,需要用户携带随机字符串
二、应用
1、普通表单
veiw中设置返回值: return render_to_response(‘Account/Login.html‘,data,context_instance=RequestContext(request)) 或者 return render(request, ‘xxx.html‘, data) html中设置Token: {% csrf_token %}
2、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>
三、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 # 1、先自定义一个闭包函数做装饰器 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>
时间: 2024-10-13 16:22:20