xss攻击:
跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS
恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用
户的目的。
解决方法:
- 慎用 safe和mark_safe
- 非要用,一定要过滤关键字
1 class comment(View):
2 def get(self,request):
3 return render(request,'comment.html')
4 def post(self,request):
5 v=request.POST.get('content')
6 if 'script' in v:
7 return render(request,'comment.html',{'error':'小臂崽子还黑我'})
8 else:
9 msg.append(v)
10 return render(request,'comment.html')
11
12 class info(View):
13 def get(self,request):
14 # return render(request,'info.html',{'msg':msg})
15
16 from django.utils.safestring import mark_safe
17 temp="<a href='http://www.baidu.com'>百度</a>"
18 newtemp=mark_safe(temp)
19 return render(request,'info.html',{'newtemp':newtemp})
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,
是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信
任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被
认为比XSS更具危险性。
a. 基本应用
form表单中添加
{% csrf_token %}
b. 全站禁用
# 'django.middleware.csrf.CsrfViewMiddleware',
c. 局部禁用
'django.middleware.csrf.CsrfViewMiddleware',
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def csrf1(request):
pass
d. 局部使用
# 'django.middleware.csrf.CsrfViewMiddleware',
from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_protect
def csrf1(request):
c. 特殊CBV
from django.views import View
from django.utils.decorators import method_decorator
@method_decorator(csrf_protect,name='dispatch')
class Foo(View):
def get(self,request):
pass
def post(self,request):
pass
在Django框架中, 在开启了csrf验证服务后,必须在文档的form表单中获取随机码,form表单的内容才能提交
用户使用get请求访问网页时,服务端会发送随机码到网页中当用户提交form表单,不仅会提交服务端生成的随机码,
也会在cookie中生成一个CSRF键值对
Ajax提交数据时候,携带CSRF:
a. 将CSRF放置在data中携带
1 function foo(){
2 var csrf=$('input[name="csrfmiddlewaretoken"]').val();
3 var name=$('#user').val();
4 $.ajax({
5 url:'/bar.html',
6 type:'POST',
7 data:{ 'user':name,'csrfmiddlewaretoken':csrf},
8 success:function (arg){
9 console.log(arg)
10 }
11 })
12 }
13
14
15
16
17
18 {% csrf_token %}
19 <input id="user" type="text" name="user" />
20 <input type="submit" value="提交"/>
21 <a onclick="submitForm();">Ajax提交</a>
b. 将cookie放在请求头中携带
1 {% csrf_token %} 2 <input type="text" id='user' name="user"> 3 <input type="submit" value="提交"> 4 <a onclick="foo()">ajax提交</a> 5 6 7 function foo(){ 8 var token=$.cookie('csrftoken'); 9 var name=$('#user').val(); 10 $.ajax({ 11 url:'/bar.html', 12 type:'POST', 13 headers:{'X-CSRFToken':token}, 14 data:{ 'user':name}, 15 success:function (arg){ 16 console.log(arg) 17 } 18 }) 19 }