Django如何实现防止XSS攻击


Posted in Python onOctober 13, 2020

一、什么是XSS攻击

xss攻击:----->web注入

  xss跨站脚本攻击(Cross site script,简称xss)是一种“HTML注入”,由于攻击的脚本多数时候是跨域的,所以称之为“跨域脚本”。

我们常常听到“注入”(Injection),如SQL注入,那么到底“注入”是什么?注入本质上就是把输入的数据变成可执行的程序语句。SQL注入是如此,XSS也如此,只不过XSS一般注入的是恶意的脚本代码,这些脚本代码可以用来获取合法用户的数据,如Cookie信息。

PS: 把用户输入的数据以安全的形式显示,那只能是在页面上显示字符串。

django框架中给数据标记安全方式显示(但这种操作是不安全的!):

  •  - 模版页面上对拿到的数据后写上safe. ----> {{XXXX|safe}}
  •  - 在后台导入模块:from django.utils.safestring import mark_safe

  把要传给页面的字符串做安全处理 ----> s = mark_safe(s)

二、测试代码

实施XSS攻击需要具备两个条件:

一、需要向web页面注入恶意代码;

二、这些恶意代码能够被浏览器成功的执行。

解决办法:

1、一种方法是在表单提交或者url参数传递前,对需要的参数进行过滤。

2、在后台对从数据库获取的字符串数据进行过滤,判断关键字。

3、设置安全机制。

django框架:内部机制默认阻止了。它会判定传入的字符串是不安全的,就不会渲染而以字符串的形式显示。如果手贱写了safe,那就危险了,若想使用safe,那就必须在后台对要渲染的字符串做过滤了。所以在开发的时候,一定要慎用安全机制。尤其是对用户可以提交的并能渲染的内容!!!

这里是不存在xss漏洞的写法,因为django已经做了防攻击措施

index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>

<h1>评论</h1>
{% for item in msg %}
{#  <div>{{ item|safe }}</div>#} #这里被注释的,是因为,|safe 加了这个就认为是安全的了,写入 <script> alert(123)</script> 就会恶意加载
  <div>{{ item}}</div>
{% endfor %}

</body>
</html>

conment.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>

<form action="/comment/" method="POST">
  <input type="text" name="content">
  <input type="submit" value="提交">
</form>
</body>
</html>

views.py

from django.shortcuts import render,HttpResponse

# Create your views here.
msg = []

def comment(request):
  if request.method == "GET":
    return render(request,"comment.html")
  else:
    v = request.POST.get("content")
    msg.append(v)
    return render(request,"comment.html")
def index(request):
  return render(request,"index.html",{"msg":msg})########################################################
def test(request):
  from django.utils.safestring import mark_safe
  temp = "<a href='http://www.baidu.com'>百度</a>"
  newtemp = mark_safe(temp)  #这里相当于加了 |safe ,把字符串认为是安全的,执行代码,如果不加 test.html里面 {{ temp }} 就只会显示出字符串,而不是 a 标签
  return render(request,'test.html',{'temp':newtemp})

urls.py

from app01 import views
urlpatterns = [
  url(r'^admin/', admin.site.urls),
  url(r'^index/', views.index),
  url(r'^comment/',views.comment),
]

------------------------------------######################_-------------------------------

以下是做了用户输入判断,检测是否有特殊字符

views.py

from django.shortcuts import render,HttpResponse

# Create your views here.
msg = []

def comment(request):
  if request.method == "GET":
    return render(request,"comment.html")
  else:
    v = request.POST.get("content")
    if "script" in v:
      return render(request, "comment.html",{'error':'小比崽子'})
    else:
      msg.append(v)
      return render(request,'comment.html')
def index(request):
  return render(request,"index.html",{"msg":msg})

index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>

<h1>评论</h1>
{% for item in msg %}
  <div>{{ item|safe }}</div>
{#  <div>{{ item}}</div>#}
{% endfor %}

</body>
</html>

comment.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>

<form action="/comment/" method="POST">
  <input type="text" name="content">
  <input type="submit" value="提交">{{ error }}
</form>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用os模块的os.walk遍历文件夹示例
Jan 27 Python
在python中的socket模块使用代理实例
May 29 Python
记录Django开发心得
Jul 16 Python
使用Python的package机制如何简化utils包设计详解
Dec 11 Python
用python实现的线程池实例代码
Jan 06 Python
python使用pycharm环境调用opencv库
Feb 11 Python
Python实现获取前100组勾股数的方法示例
May 04 Python
Python实现抓取HTML网页并以PDF文件形式保存的方法
May 08 Python
Python3基本输入与输出操作实例分析
Feb 14 Python
jupyter notebook运行命令显示[*](解决办法)
May 18 Python
浅谈keras.callbacks设置模型保存策略
Jun 18 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
Nov 28 Python
5款实用的python 工具推荐
Oct 13 #Python
Python内置函数及功能简介汇总
Oct 13 #Python
Python pymysql模块安装并操作过程解析
Oct 13 #Python
Python安装并操作redis实现流程详解
Oct 13 #Python
python按照list中字典的某key去重的示例代码
Oct 13 #Python
Python importlib模块重载使用方法详解
Oct 13 #Python
Pycharm添加虚拟解释器报错问题解决方案
Oct 13 #Python
You might like
php随机输出名人名言的代码
2012/10/07 PHP
使用JavaScript创建新样式表和新样式规则
2016/06/14 PHP
PHP设计模式之模板方法模式实例浅析
2018/12/20 PHP
Laravel 连接(Join)示例
2019/10/16 PHP
JS类库Bindows1.3中的内存释放方式分析
2007/03/08 Javascript
自定义右键属性覆盖浏览器默认右键行为实现代码
2013/02/02 Javascript
javascript中兼容主流浏览器的动态生成iframe方法
2014/05/05 Javascript
js遍历子节点子元素附属性及方法
2014/08/19 Javascript
如何在MVC应用程序中使用Jquery
2014/11/17 Javascript
jQuery中find()方法用法实例
2015/01/07 Javascript
跟我学习javascript的作用域与作用域链
2015/11/19 Javascript
jQuery插件Validate实现自定义校验结果样式
2016/01/18 Javascript
React Router基础使用
2017/01/17 Javascript
Swiper实现轮播图效果
2017/07/03 Javascript
ionic 3.0+ 项目搭建运行环境的教程
2017/08/09 Javascript
利用JS如何计算字符串所占字节数示例代码
2017/09/13 Javascript
babel之配置文件.babelrc入门详解
2018/02/22 Javascript
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
2018/08/06 Javascript
JS执行控制之节流模式实例分析
2018/12/21 Javascript
VueCli3.0中集成MockApi的方法示例
2019/07/05 Javascript
vue项目中引入Sass实例方法
2019/08/27 Javascript
微信小程序实现吸顶特效
2020/01/08 Javascript
vue实践---根据不同环境,自动转换请求的url地址操作
2020/09/21 Javascript
分析并输出Python代码依赖的库的实现代码
2015/08/09 Python
Python使用Pickle库实现读写序列操作示例
2018/06/15 Python
pandas使用apply多列生成一列数据的实例
2018/11/28 Python
python 串口读取+存储+输出处理实例
2019/12/26 Python
flask框架蓝图和子域名配置详解
2020/01/25 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
2020/06/02 Python
python 实时调取摄像头的示例代码
2020/11/25 Python
CSS3实现淘宝留白的方法
2020/06/05 HTML / CSS
回馈慈善的设计师太阳镜:DIFF eyewear
2019/10/17 全球购物
项目管理计划书
2014/01/09 职场文书
《平行四边形的面积》教学反思
2016/02/16 职场文书
Python基础之赋值,浅拷贝,深拷贝的区别
2021/04/30 Python
学会Python数据可视化必须尝试这7个库
2021/06/16 Python