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文件和目录操作详解
Feb 08 Python
Django框架下在视图中使用模版的方法
Jul 16 Python
python3使用PyMysql连接mysql数据库实例
Feb 07 Python
Python遍历pandas数据方法总结
Feb 09 Python
Python模拟登录的多种方法(四种)
Jun 01 Python
PYQT5设置textEdit自动滚屏的方法
Jun 14 Python
Python进阶:生成器 懒人版本的迭代器详解
Jun 29 Python
python 用 xlwings 库 生成图表的操作方法
Dec 22 Python
Python3 读取Word文件方式
Feb 13 Python
python实现可下载音乐的音乐播放器
Feb 25 Python
详解Ubuntu环境下部署Django+uwsgi+nginx总结
Apr 02 Python
Python3+selenium配置常见报错解决方案
Aug 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
Yii2中Restful API原理实例分析
2016/07/25 PHP
PHP中功能强大却很少使用的函数实例小结
2016/11/10 PHP
详解Yaf框架PHPUnit集成测试方法
2017/12/27 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
Jquery 复选框取值兼容FF和IE8(测试有效)
2013/10/29 Javascript
一个简单的JS时间控件示例代码(JS时分秒时间控件)
2013/11/22 Javascript
jquery中each方法示例和常用选择器
2014/07/08 Javascript
js交换排序 冒泡排序算法(Javascript版)
2014/10/04 Javascript
详解javascript传统方法实现异步校验
2016/01/22 Javascript
Bootstrap栅格系统学习笔记
2016/11/25 Javascript
jQuery Easyui 下拉树组件combotree
2016/12/16 Javascript
微信小程序 石头剪刀布实例代码
2017/01/04 Javascript
jquery 实时监听输入框值变化的完美方法(必看)
2017/01/26 Javascript
js实现省份下拉菜单效果
2017/02/15 Javascript
微信小程序滚动Tab实现左右可滑动切换
2017/08/17 Javascript
js实现鼠标跟随运动效果
2020/08/02 Javascript
基于JSONP原理解析(推荐)
2017/12/04 Javascript
jQuery中ajax请求后台返回json数据并渲染HTML的方法
2018/08/08 jQuery
JavaScript使用indexOf()实现数组去重的方法分析
2018/09/04 Javascript
JavaScript面向对象中接口实现方法详解
2019/07/24 Javascript
JavaScript实现随机点名器
2020/03/25 Javascript
手把手教您实现react异步加载高阶组件
2020/04/07 Javascript
JS面向对象实现飞机大战
2020/08/26 Javascript
vue路由结构可设一层方便动态添加路由操作
2020/08/31 Javascript
[01:33]DOTA2上海特级锦标赛 LIQUID战队完整宣传片
2016/03/16 DOTA
python和opencv实现抠图
2018/07/18 Python
Python实现FTP弱口令扫描器的方法示例
2019/01/31 Python
Zatchels官网:英国剑桥包品牌
2021/01/12 全球购物
机电一体化毕业生求职信
2013/11/02 职场文书
小学二年级学生评语
2014/04/21 职场文书
就业协议书范本
2014/10/08 职场文书
2014幼儿园大班工作总结
2014/11/10 职场文书
导游词欢迎词
2015/02/02 职场文书
公司保洁员管理制度
2015/08/04 职场文书
酒店厨房管理制度
2015/08/06 职场文书
MySQL的存储函数与存储过程的区别解析
2022/04/08 MySQL