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中使用mechanize模块模拟浏览器功能
May 05 Python
python算法演练_One Rule 算法(详解)
May 17 Python
Python3计算三角形的面积代码
Dec 18 Python
Python和Java进行DES加密和解密的实例
Jan 09 Python
python字符串string的内置方法实例详解
May 14 Python
Python判断一个三位数是否为水仙花数的示例
Nov 13 Python
Django上使用数据可视化利器Bokeh解析
Jul 31 Python
在django-xadmin中APScheduler的启动初始化实例
Nov 15 Python
python实现PCA降维的示例详解
Feb 24 Python
浅谈keras中的batch_dot,dot方法和TensorFlow的matmul
Jun 18 Python
pycharm2020.1.2永久破解激活教程,实测有效
Oct 29 Python
python如何编写类似nmap的扫描工具
Nov 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仿ZOL分页类代码
2008/10/02 PHP
程序员编程十条戒律
2009/07/09 PHP
php入门学习知识点一 PHP与MYSql连接与查询
2011/07/14 PHP
PHP中防止直接访问或查看或下载config.php文件的方法
2012/07/07 PHP
php数组查找函数总结
2014/11/18 PHP
php绘图之在图片上写中文和英文的方法
2015/01/24 PHP
PHP生成树的方法
2015/07/28 PHP
原生javascript获取元素样式
2014/12/31 Javascript
nodejs事件的监听与触发的理解分析
2015/02/12 NodeJs
jQuery实现精美的多级下拉菜单特效
2015/03/14 Javascript
pace.js页面加载进度条插件
2015/09/29 Javascript
jQuery判断是否存在滚动条的简单方法
2016/09/17 Javascript
基于$.ajax()方法从服务器获取json数据的几种方式总结
2018/01/31 Javascript
Vue2.0 实现移动端图片上传功能
2018/05/30 Javascript
浅谈Webpack核心模块tapable解析
2018/09/11 Javascript
vue把输入框的内容添加到页面的实例讲解
2019/11/11 Javascript
[19:14]DOTA2 HEROS教学视频教你分分钟做大人-维萨吉
2014/06/24 DOTA
[01:33]真香警告!DOTA2勇士令状不朽珍藏Ⅱ饰品欣赏
2018/06/26 DOTA
[01:03:22]LGD vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
Python的ORM框架SQLObject入门实例
2014/04/28 Python
Python引用(import)文件夹下的py文件的方法
2014/08/26 Python
python实现猜数字小游戏
2020/03/24 Python
Pycharm小白级简单使用教程
2020/01/08 Python
利用 Python ElementTree 生成 xml的实例
2020/03/06 Python
Python生成器常见问题及解决方案
2020/03/21 Python
Python3爬虫发送请求的知识点实例
2020/07/30 Python
详解python中的异常捕获
2020/12/15 Python
新闻学专业应届生求职信
2013/11/08 职场文书
国家励志奖学金获奖感言
2014/01/09 职场文书
遵纪守法演讲稿
2014/05/23 职场文书
装修施工安全责任书
2014/07/24 职场文书
大学生求职意向书
2015/05/11 职场文书
2015年小学美术工作总结
2015/05/25 职场文书
浅谈如何提高PHP代码质量之单元测试
2021/05/28 PHP
Python常用配置文件ini、json、yaml读写总结
2021/07/09 Python
Mysql调整优化之四种分区方式以及组合分区
2022/04/13 MySQL