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
View Code
复制代码

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
View Code
复制代码

 

此时提交数据的话就需要在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}
View Code
复制代码

 

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设定死的,就得这样写
复制代码

 

posted @   磕伴  阅读(174)  评论(0编辑  收藏  举报
编辑推荐:
· 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应用必不可少的技术
点击右上角即可分享
微信分享提示