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
Python实现全角半角转换的方法
Aug 18 Python
使用python实现正则匹配检索远端FTP目录下的文件
Mar 25 Python
初步探究Python程序的执行原理
Apr 11 Python
使用Python中的线程进行网络编程的入门教程
Apr 15 Python
Python类的动态修改的实例方法
Mar 24 Python
Python实现句子翻译功能
Nov 14 Python
Python实现控制台中的进度条功能代码
Dec 22 Python
Python使用pylab库实现绘制直方图功能示例
Jun 01 Python
Python3.5 Pandas模块之DataFrame用法实例分析
Apr 23 Python
使用python来调用CAN通讯的DLL实现方法
Jul 03 Python
pandas.DataFrame.drop_duplicates 用法介绍
Jul 06 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者的疑难问答(1)
2006/10/09 PHP
使用apache模块rewrite_module (转)
2007/02/14 PHP
保存到桌面、设为桌面且带图标的PHP代码
2013/11/19 PHP
详解php比较操作符的安全问题
2015/12/03 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
Javascript 中的 &amp;&amp; 和 || 使用小结
2010/04/25 Javascript
JQuery.ajax传递中文参数的解决方法 推荐
2011/03/28 Javascript
javascript使用定时函数实现跳转到某个页面
2013/12/25 Javascript
JS实现让访问者自助选择网页文字颜色的方法
2015/02/24 Javascript
javascript中eval解析JSON字符串
2016/02/27 Javascript
js实现手机拍照上传功能
2017/01/17 Javascript
微信小程序之绑定点击事件实例详解
2017/07/07 Javascript
Angular2的管道Pipe的使用方法
2017/11/07 Javascript
web前端vue filter 过滤器
2018/01/12 Javascript
JavaScript面向对象程序设计创建对象的方法分析
2018/08/13 Javascript
vue3.0 CLI - 2.1 -  component 组件入门教程
2018/09/14 Javascript
JavaScript一元正号运算符示例代码
2019/06/30 Javascript
[05:31]DOTA2英雄梦之声_第08期_莉娜
2014/06/23 DOTA
[04:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster 选手采访
2021/03/11 DOTA
图文讲解选择排序算法的原理及在Python中的实现
2016/05/04 Python
AI人工智能 Python实现人机对话
2017/11/13 Python
Python实现改变与矩形橡胶的线条的颜色代码示例
2018/01/05 Python
django初始化数据库的实例
2018/05/27 Python
Python3实现爬虫爬取赶集网列表功能【基于request和BeautifulSoup模块】
2018/12/05 Python
Python传递参数的多种方式(小结)
2019/09/18 Python
使用CSS3制作版头动画效果
2020/12/24 HTML / CSS
canvas实现圆绘制的示例代码
2019/09/11 HTML / CSS
服务之星事迹材料
2014/05/03 职场文书
学校政风行风评议工作总结
2014/10/21 职场文书
优秀团队申报材料
2014/12/26 职场文书
初中生毕业评语
2014/12/29 职场文书
2016会计专业自荐信范文
2016/01/28 职场文书
2019最新版试用期劳动合同模板!
2019/07/04 职场文书
开学季:喜迎新生,迎新标语少不了
2019/11/07 职场文书
Python下opencv库的安装过程及问题汇总
2021/06/11 Python
Android Studio实现简易进制转换计算器
2022/05/20 Java/Android