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安装第三方库的3种方法
Jun 21 Python
Python探索之静态方法和类方法的区别详解
Oct 27 Python
python字典操作实例详解
Nov 16 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
Jul 12 Python
Python Flask框架扩展操作示例
May 03 Python
详解Python中的各种转义符\n\r\t
Jul 10 Python
Django如何简单快速实现PUT、DELETE方法
Jul 24 Python
python selenium循环登陆网站的实现
Nov 04 Python
新手入门学习python Numpy基础操作
Mar 02 Python
pytorch 常用函数 max ,eq说明
Jun 28 Python
Python文件夹批处理操作代码实例
Jul 21 Python
python爬虫用mongodb的理由
Jul 28 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
便携利器 — TECSUN PL-365简评
2021/03/02 无线电
php实现文件下载代码分享
2014/08/19 PHP
yii2.0之GridView自定义按钮和链接用法
2014/12/15 PHP
PHP仿微信多图片预览上传实例代码
2016/09/13 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
php统计数组不同元素的个数的实例方法
2019/09/26 PHP
Laravel 将数据表的数据导出,并生成seeds种子文件的方法
2019/10/09 PHP
phpmyadmin在宝塔面板里进不去的解决方案
2020/07/06 PHP
javascript函数中的arguments参数
2010/08/01 Javascript
jquery访问ashx文件示例代码
2014/08/11 Javascript
node.js中watch机制详解
2014/11/17 Javascript
JavaScript 性能优化小结
2015/10/12 Javascript
jquery.validate提示错误信息位置方法
2016/01/22 Javascript
zTree插件下拉树使用入门教程
2016/04/11 Javascript
Bootstrap布局方式详解
2016/05/27 Javascript
JS实现探测网站链接的方法【测试可用】
2016/11/08 Javascript
AngularJS中的promise用法分析
2017/05/19 Javascript
在Vue中获取组件声明时的name属性方法
2018/09/12 Javascript
js中console在一行内打印字符串和对象的方法
2019/09/10 Javascript
微信小程序 wxParse插件显示视频问题
2019/09/27 Javascript
实例解析Python中的__new__特殊方法
2016/06/02 Python
python3.6利用pyinstall打包py为exe的操作实例
2018/10/31 Python
python-Web-flask-视图内容和模板知识点西宁街
2019/08/23 Python
Python实现中值滤波去噪方式
2019/12/18 Python
python重要函数eval多种用法解析
2020/01/14 Python
tensorflow通过模型文件,使用tensorboard查看其模型图Graph方式
2020/01/23 Python
python 使用递归回溯完美解决八皇后的问题
2020/02/26 Python
python自动提取文本中的时间(包含中文日期)
2020/08/31 Python
CSS3制作ajax loader icon实现思路及代码
2013/08/25 HTML / CSS
Seavenger官网:潜水服、浮潜、靴子和袜子
2020/03/05 全球购物
关于递归的一道.NET面试题
2013/05/12 面试题
大学毕业生工作的自我评价
2013/10/01 职场文书
不拖欠农民工工资承诺书
2014/03/31 职场文书
入学证明
2015/06/23 职场文书
Win10多屏显示如何设置?Win10电脑多屏显示设置操作方法
2022/07/07 数码科技