XSS攻击&CSRF攻击 ----Django解决方案
XSS攻击:
XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。
比如获取用户的cookie。
Django已经默认做了处理,自动防御xss攻击。
但是有时候需要通过传输HTML代码并且让其显示在页面上的时候怎么做:
在需要的时候添加 xxx|safe 需要注意以下几点:
1.不能在别人能修改的地方添加
2.添加的时候要带上特殊字符的过滤
CSRF攻击(跨站请求伪造):
用户U登录了一家银行B,然后同时用点进去一个带颜色的网站,网站有些特殊的图片(隐藏着href请求银行B转账的标签)
用户U点击后,因为之前已经成功登录到银行B,拿到其对应的cookie, 这个隐藏的href请求就被银行识别为用户U的操作
带颜色网站通过伪造转账请求,成功收到用户在毫不知情下的转账。
应对方法:
1.银行在收到第一次get请求的时候,返回一串随机字符串,后续的操作用户需要带着这个随机字符串来(CSRF),请求才有效。
而且这个随机字符串只会在银行的页面有。带颜色网站因为没有这个随机字符串,请求无效403。(除非破解其随机字符串算法)
2.短信验证
3.令牌
Django自动开启CSRF防御
settings-MIDDLEWARE- django.middleware.csrf.CsrfViewMiddleware',
FBV

#--------全局禁用 #'django.middleware.csrf.CsrfViewMiddleware' 直接把这的东西注释掉就行 #---------局部禁用 'django.middleware.csrf.CsrfViewMiddleware' from django.views.decorators.csrf import csrf_exempt 在对应函数上加上装饰器 @csrf_exempt def default(request): pass #---------局部使用 #'django.middleware.csrf.CsrfViewMiddleware' from django.views.decorators.csrf import csrf_protect @csrf_protect def default(request): pass
CBV

1 from django.utils.decorators import method_decorator 2 @method_decorator(csrf_protect) 3 加到类上面,对整个类起作用 4 加到类里面某个方法上面,对这个方法起作用 5 @method_decorator(csrf_protect,name='get')#对类里面的get方法加装饰器 6 @method_decorator(csrf_protect,name='post')#可以在类上这样叠加着写,给多个方法加 7 给dispatch加相当于给所有方法都加上 8 9 ps: 10 dispatch作用: 11 12 dispatch方法接受请求并最终返回响应。通常,它通过调用另一个方法(如get)来返回响应。把它看作是请求和响应之间的中间人。 13 14 15 from django.shortcuts import HttpResponse,render,redirect 16 17 from django.views import View 18 19 class Login(View): 20 21 def dispatch(self, request, *args, **kwargs): 22 print('before') # 类似装饰器 先执行before 再执行after 中间的就是下面方法执行结果 23 obj=super(Login,self).dispatch(request, *args, **kwargs) 24 print('after') 25 return obj 26 27 def get(self,request): 28 return render(request, 'login1.html') 29 30 def post(self,request): 31 print(request.POST.get('title')) 32 return HttpResponse('ok') 33 34 #title=‘牛牛’ 35 36 37 #执行结果: 38 before 39 after 40 before 41 牛牛 42 after
此时提交数据的话就需要在form表单和Ajax中带上添加上对应的东西
在form表单中加上{% csrf_token %}
1 2 3 4 5 6 | < form method="POST" action="/xx/"> {% csrf_token %} < p >用户:< input id="" type="text" name="username"/></ p > < p >密码:< input type="password" name="password"/></ p > < p >< input type="submit" name="提交">{{message}}</ p > </ form >不仅会在form内部加上字符串,在你的cookie里面也会加上csrftoken |
Ajax请求的时候放入data中:

从源码看form表单内csrf_token的值: <input type="hidden" name="csrfmiddlewaretoken" value="d11IbXhGli1qRbN3QogQhdWeXHBMnwCJzbtQyCfef0YecNLuCIhHTFzh25FYnkX7"> var csrf=$('input[name="csrfmiddlewaretoken"]').val(); var user=$('#id').val(); $.ajax( { url:'/form_login_ajax/', type:'POST', data:{'csrfmiddlewaretoken':csrf,'use'=user} }) data里面的key要与后台获取值的key一一对应 #也可以把CFRF的值这样放入data data:{'csrfmiddlewaretoken':'{{csrf_token}}','use'=user}
Ajax请求的时候获取cookie中的csrftoken,放入请求头headers中
通过js获取cookie的值 在F12-Console 里面:document.cookie 可以看到CFRS随机字符串(键值) 插件:jquery.cookie.js(依赖于jquery) 可以cookie操作 $.cookie('csrftoken')直接拿到CFRF随机字符串 $.cookie('qwer','asdf') ,在本地cookie里面再增加一个键值对 var token=$.cookie('csrftoken') #得放到请求头里面 $.ajax( { url:'/form_login_ajax/', type:'POST', headers:{'X-CSRFToken':token}, data:{'user':user}, }) X-CSRFToken是Django设定死的,就得这样写
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术