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 相关文章推荐
pycharm 使用心得(三)Hello world!
Jun 05 Python
python实现根据用户输入从电影网站获取影片信息的方法
Apr 07 Python
Python的Flask框架中集成CKeditor富文本编辑器的教程
Jun 13 Python
Python、PyCharm安装及使用方法(Mac版)详解
Apr 28 Python
Python2.7编程中SQLite3基本操作方法示例
Aug 09 Python
Python语言描述最大连续子序列和
Dec 05 Python
OpenCV-Python实现轮廓检测实例分析
Jan 05 Python
简述Python2与Python3的不同点
Jan 21 Python
python实现监控某个服务 服务崩溃即发送邮件报告
Jun 21 Python
Python实现查找二叉搜索树第k大的节点功能示例
Jan 24 Python
在Python中如何传递任意数量的实参的示例代码
Mar 21 Python
将不规则的Python多维数组拉平到一维的方法实现
Jan 11 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实现浏览器点击下载TXT文档的方法详解
2013/06/02 PHP
PHP flush()与ob_flush()的区别详解
2013/06/03 PHP
linux实现php定时执行cron任务详解
2013/12/24 PHP
PHP邮件群发机实现代码
2016/02/16 PHP
php+ajax实现异步上传文件或图片功能
2017/07/18 PHP
PHP回调函数概念与用法实例分析
2017/11/03 PHP
php实现获取近几日、月时间示例
2019/07/06 PHP
PHP实现一个按钮点击上传多个图片操作示例
2020/01/23 PHP
Js+XML 操作
2006/09/20 Javascript
Javascript的一种模块模式
2008/03/22 Javascript
Javascript 复制数组实现代码
2009/11/26 Javascript
javascript Firefox与IE 替换节点的方法
2010/02/24 Javascript
javascript实现在某个元素上阻止鼠标右键事件的方法和实例
2014/08/12 Javascript
Jquery获取当前城市的天气信息
2016/08/05 Javascript
react-router中的属性详解
2017/06/01 Javascript
Node.js五大应用性能技巧小结(必须收藏)
2017/08/09 Javascript
原生JS实现图片无缝滚动方法(附带封装的运动框架)
2017/10/01 Javascript
vue-cli中vue本地实现跨域调试接口
2019/01/16 Javascript
实例讲解v-if和v-show的区别
2019/01/31 Javascript
JS实现扫码枪扫描二维码功能
2020/01/03 Javascript
Python3.x和Python2.x的区别介绍
2013/02/12 Python
Ubuntu 16.04 LTS中源码安装Python 3.6.0的方法教程
2016/12/27 Python
numpy np.newaxis 的实用分享
2019/11/30 Python
Python函数的定义方式与函数参数问题实例分析
2019/12/26 Python
pyspark 随机森林的实现
2020/04/24 Python
德国家具、照明、家居用品网上商店:Wayfair.de
2020/02/13 全球购物
泰国在线书店:SE-ED
2020/06/21 全球购物
本科毕业生自荐信
2014/06/02 职场文书
大学生找工作求职信
2014/07/09 职场文书
党的群众路线教育实践活动对照检查材料思想汇报(党员篇)
2014/09/25 职场文书
县委常委班子对照检查材料思想汇报
2014/09/28 职场文书
2016中秋节广告语
2016/01/28 职场文书
MySQL之DML语言
2021/04/05 MySQL
浅谈PHP7中的一些小技巧
2021/05/29 PHP
SpringBoot SpringEL表达式的使用
2021/07/25 Java/Android
关于python爬虫应用urllib库作用分析
2021/09/04 Python