Django之防止xss和csrf
1、防止 xss(跨站脚本语言)
慎用safe和make_safe
# safe和make_safe 的用法 后端传值:value="<a href="">点击</a>" 前端使用:{{ value|safe}} 结果直接再前端显示一个a标签 # 后端也可以告诉django不要转义 from django.utils.safestring import mark_safe s1 = mark_safe("<h1>我是h1</h1>") s2 = mark_safe("<script>alert(123)</script>")
使用BeautifulSoup4对输入后端得html文本经行校验。BeautifulSoup4中文文档
2、防止CSRF 跨站请求伪造
2.1 form 表单中应用
<form action="" method="post"> {% csrf_token %} <p>用户名:<input type="text" name="name"></p> <p>密码:<input type="text" name="password"></p> <p><input type="submit"></p> </form>
2.2 ajax提交中应用
1. 直接放在data里
<script> $(".btn").click(function () { $.ajax({ url: '', type: 'post', data: { 'name': $('[name="name"]').val(), 'password': $("#pwd").val(), 'csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val() // {{ csrf_token }} }, success: function (data) { console.log(data) } }) }) </script>
2. 放在cookie里
<script> $(".btn").click(function () { var token=$.cookie('csrftoken') //var token='{{ csrf_token }}' $.ajax({ url: '', headers:{'X-CSRFToken':token}, type: 'post', data: { 'name': $('[name="name"]').val(), 'password': $("#pwd").val(), }, success: function (data) { console.log(data) } }) }) </script>
2.3 后端设置是否禁用
1. 在FBV中使用
from django.views.decorators.csrf import csrf_exempt,csrf_protect # 不再检测,局部禁用(前提是全站使用) # @csrf_exempt # 检测,局部使用(前提是全站禁用) # @csrf_protect def csrf_token(request): if request.method=='POST': print(request.POST) return HttpResponse('ok') return render(request,'csrf_token.html')
2. 在CBV中使用
# CBV中使用 # 说明:由于在执行post之前先执行dispatch,所以在类名上给dispatch设置或直接对post方法设置 from django.views import View from django.views.decorators.csrf import csrf_exempt,csrf_protect from django.utils.decorators import method_decorator @method_decorator(csrf_exempt,name='dispatch') class Foo(View): def dispatch(self, request, *args, **kwargs): return super(TestCSRF, self).dispatch(request, *args, **kwargs) def get(self,request): pass def post(self,request): pass

浙公网安备 33010602011771号