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 UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
Apr 24 Python
python执行get提交的方法
Apr 29 Python
Python自动扫雷实现方法
Jul 25 Python
深入理解python try异常处理机制
Jun 01 Python
python好玩的项目—色情图片识别代码分享
Nov 07 Python
Python实现PS滤镜功能之波浪特效示例
Jan 26 Python
Python实现删除时保留特定文件夹和文件的示例
Apr 27 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
Oct 21 Python
django模板加载静态文件的方法步骤
Mar 01 Python
Python 中的 import 机制之实现远程导入模块
Oct 29 Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
Feb 11 Python
Python多分支if语句的使用
Sep 03 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自动跳转中英文页面
2008/07/29 PHP
PHP基础知识回顾
2012/08/16 PHP
深入phpMyAdmin的安装与配置的详细步骤
2013/05/07 PHP
迁移PHP版本到PHP7
2015/02/06 PHP
PHP文件下载实例代码浅析
2016/08/17 PHP
Yii2 hasOne(), hasMany() 实现三表关联的方法(两种)
2017/02/15 PHP
php JWT在web端中的使用方法教程
2018/09/06 PHP
laravel 多图上传及图片的存储例子
2019/10/14 PHP
js不是基础的基础
2006/12/24 Javascript
到处都是jQuery选择器的年代 不了解它们的性能,行吗
2012/06/18 Javascript
浅谈JavaScript中运算符的优先级
2015/07/07 Javascript
jQuery实现两款有动画功能的导航菜单代码
2015/09/16 Javascript
轻量级jQuery插件slideBox实现带底栏轮播(焦点图)代码
2016/03/28 Javascript
JavaScript 弹出子窗体并返回结果到父窗体的实现代码
2016/05/28 Javascript
很实用的js选项卡切换效果
2016/08/12 Javascript
jQuery实现倒计时(倒计时年月日可自己输入)
2016/12/02 Javascript
ES6中Math对象的部分扩展
2017/02/20 Javascript
关于axios如何全局注册浅析
2018/01/14 Javascript
解决vue+webpack打包路径的问题
2018/03/06 Javascript
你不知道的Vue技巧之--开发一个可以通过方法调用的组件(推荐)
2019/04/15 Javascript
layui给下拉框、按钮状态、时间赋初始值的方法
2019/09/10 Javascript
解决ele ui 表格表头太长问题的实现
2019/11/13 Javascript
Django权限机制实现代码详解
2018/02/05 Python
python批量查询、汉字去重处理CSV文件
2018/05/31 Python
python3.X 抓取火车票信息【修正版】
2018/06/19 Python
解决python3 urllib 链接中有中文的问题
2018/07/16 Python
python实现Flappy Bird源码
2018/12/24 Python
树莓派3 搭建 django 服务器的实例
2019/08/29 Python
Python+Kepler.gl轻松制作酷炫路径动画的实现示例
2020/06/02 Python
Python如何将装饰器定义为类
2020/07/30 Python
Skyscanner澳大利亚:全球领先的旅游搜索网站
2018/03/24 全球购物
放飞梦想演讲稿800字
2014/08/26 职场文书
乡镇党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
英语教师个人工作总结
2015/02/09 职场文书
我的1919观后感
2015/06/03 职场文书
基于Go Int转string几种方式性能测试
2021/04/28 Golang