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使用修饰器执行函数的参数检查功能示例
Sep 26 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
Nov 23 Python
python实现快速排序的示例(二分法思想)
Mar 12 Python
python读取一个目录下所有txt里面的内容方法
Jun 23 Python
对python中的 os.mkdir和os.mkdirs详解
Oct 16 Python
Python参数解析模块sys、getopt、argparse使用与对比分析
Apr 02 Python
Python交互式图形编程的实现
Jul 25 Python
Django中的cookie和session
Aug 27 Python
python requests.get带header
May 05 Python
使用Python爬取Json数据的示例代码
Dec 07 Python
Python 实现一个简单的web服务器
Jan 03 Python
python基于Kivy写一个图形桌面时钟程序
Jan 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 session的应用详细介绍
2017/03/22 PHP
jquery简单体验
2007/01/10 Javascript
jquery创建div 实现代码
2009/04/27 Javascript
jQuery增加和删除表格项目及实现表格项目排序的方法
2016/05/30 Javascript
js倒计时简单实现代码
2016/08/11 Javascript
使用ajaxfileupload.js实现上传文件功能
2016/08/13 Javascript
JS获取中文拼音首字母并通过拼音首字母快速查找页面内对应中文内容的方法【附demo源码】
2016/08/19 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
2016/11/07 Javascript
原生JS实现《别踩白块》游戏(兼容IE)
2017/02/20 Javascript
vue2.0结合Element实现select动态控制input禁用实例
2017/05/12 Javascript
jQuery创建及操作xml格式数据示例
2018/05/26 jQuery
vue页面切换项目实现转场动画的方法
2019/11/12 Javascript
webpack打包html里面img后src为“[object Module]”问题
2019/12/22 Javascript
ES6 class类链式继承,实例化及react super(props)原理详解
2020/02/15 Javascript
vue 组件间的通信之子组件向父组件传值的方式
2020/07/29 Javascript
three.js 如何制作魔方
2020/07/31 Javascript
JS实现4位随机验证码
2020/10/19 Javascript
nuxt 自定义 auth 中间件实现令牌的持久化操作
2020/11/05 Javascript
Python使用修饰器执行函数的参数检查功能示例
2017/09/26 Python
Python使用getpass库读取密码的示例
2017/10/10 Python
python ftp 按目录结构上传下载的实现代码
2018/09/12 Python
200行python代码实现2048游戏
2019/07/17 Python
Python GUI学习之登录系统界面篇
2019/08/21 Python
用Pelican搭建一个极简静态博客系统过程解析
2019/08/22 Python
Python Django中间件,中间件函数,全局异常处理操作示例
2019/11/08 Python
CSS3使用transition属性实现过渡效果
2018/04/18 HTML / CSS
html5新增的属性和废除的属性简要概述
2013/02/20 HTML / CSS
html5的canvas实现3d雪花飘舞效果
2013/12/27 HTML / CSS
Photobook澳大利亚:制作相片书,婚礼卡,旅行相簿
2017/01/12 全球购物
Ajax请求总共有多少种Callback
2016/07/17 面试题
经济系大学生求职信
2013/10/01 职场文书
户籍证明的格式
2014/01/13 职场文书
市政施工员自我鉴定
2014/01/15 职场文书
2015年统计员个人工作总结
2015/07/23 职场文书
初中思品教学反思
2016/02/20 职场文书
2016优秀毕业生个人事迹材料
2016/02/29 职场文书