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 20 Python
python下载文件时显示下载进度的方法
Apr 02 Python
Python Paramiko模块的安装与使用详解
Nov 18 Python
浅谈Python实现2种文件复制的方法
Jan 19 Python
查看django版本的方法分享
May 14 Python
pyqt5 QProgressBar清空进度条的实例
Jun 21 Python
从列表或字典创建Pandas的DataFrame对象的方法
Jul 06 Python
Python实现新型冠状病毒传播模型及预测代码实例
Feb 05 Python
python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例
Feb 26 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
Mar 02 Python
Python内建序列通用操作6种实现方法
Mar 26 Python
如何利用python正则表达式匹配版本信息
Dec 09 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
把77A收信机改造成收音机
2021/03/02 无线电
php中随机显示图片的函数代码
2011/06/23 PHP
php对数组排序的简单实例
2013/12/25 PHP
php+mysql数据库实现无限分类的方法
2014/12/12 PHP
常见的四种POST 提交数据方式(小总结)
2015/10/08 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
2016/02/16 PHP
php禁用函数设置及查看方法详解
2016/07/25 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
关于php unset对json_encode的影响详解
2018/11/14 PHP
基于thinkphp6.0的success、error实现方法
2019/11/05 PHP
JS嵌套函数调用上下文的问题解决
2014/03/26 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
2015/06/05 Javascript
javascript实现dom元素可拖动
2016/03/21 Javascript
基于JavaScript实现随机颜色输入框
2016/12/10 Javascript
详解vue express启动数据服务
2017/07/05 Javascript
浅谈angular2子组件的事件传递(任意组件事件传递)
2018/09/30 Javascript
Element Carousel 走马灯的具体实现
2020/07/26 Javascript
[02:28]DOTA2英雄基础教程 灰烬之灵
2013/12/19 DOTA
[50:02]完美世界DOTA2联赛循环赛 Magma vs IO BO2第一场 11.01
2020/11/02 DOTA
使用Python绘制图表大全总结
2017/02/11 Python
Python selenium抓取微博内容的示例代码
2018/05/17 Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
2019/01/29 Python
Python进阶之全面解读高级特性之切片
2019/02/19 Python
Python3.5 Pandas模块之DataFrame用法实例分析
2019/04/23 Python
python面向对象 反射原理解析
2019/08/12 Python
nginx搭建基于python的web环境的实现步骤
2020/01/03 Python
Python气泡提示与标签的实现
2020/04/01 Python
学习python需要有编程基础吗
2020/06/02 Python
Python中Selenium模块的使用详解
2020/10/09 Python
Python try except else使用详解
2021/01/12 Python
加拿大折扣、优惠券和交易网站:WagJag
2018/02/07 全球购物
计算机科学系职业生涯规划书
2014/03/08 职场文书
教师节倡议书
2014/08/30 职场文书
公安民警正风肃纪剖析材料
2014/10/10 职场文书
2019请假条的基本格式及范文!
2019/07/05 职场文书
pycharm debug 断点调试心得分享
2021/04/16 Python