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 __setattr__、 __getattr__、 __delattr__、__call__用法示例
Mar 06 Python
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
Aug 10 Python
python 调用win32pai 操作cmd的方法
May 28 Python
TensorFlow如何实现反向传播
Feb 06 Python
Python管理Windows服务小脚本
Mar 12 Python
使用Python AIML搭建聊天机器人的方法示例
Jul 09 Python
Python爬虫抓取技术的一些经验
Jul 12 Python
python opencv将图片转为灰度图的方法示例
Jul 31 Python
python脚本执行CMD命令并返回结果的例子
Aug 14 Python
PyTorch使用cpu加载模型运算方式
Jan 13 Python
在Pycharm中安装Pandas库方法(简单易懂)
Feb 20 Python
python脚本框架webpy模板控制结构
Nov 20 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
ThinkPHP应用模式扩展详解
2014/07/16 PHP
php 将json格式数据转换成数组的方法
2018/08/21 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
NiftyCube——轻松实现圆角边框
2007/02/20 Javascript
一个不错的用JavaScript实现的UBB编码函数
2007/03/09 Javascript
在textarea中屏蔽js的某个function的javascript代码
2007/04/20 Javascript
复选框全选与全不选操作实现思路
2013/08/18 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
整理JavaScript创建对象的八种方法
2015/11/03 Javascript
Js 获取、判断浏览器版本信息的简单方法
2016/08/08 Javascript
折叠菜单及选择器的运用
2017/02/03 Javascript
JavaScript中利用构造器函数模拟类的方法
2017/02/16 Javascript
template.js前端模板引擎使用详解
2017/10/10 Javascript
12条写出高质量JS代码的方法
2018/01/07 Javascript
利用js将ajax获取到的后台数据动态加载至网页中的方法
2018/08/08 Javascript
jQuery利用FormData上传文件实现批量上传
2018/12/04 jQuery
Vue-CLI 3.X 部署项目至生产服务器的方法
2019/03/22 Javascript
微信小程序实现图片上传
2019/05/23 Javascript
JavaScript实现单英文金山打字通
2020/07/24 Javascript
在layui框架中select下拉框监听更改事件的例子
2019/09/20 Javascript
vue自定义正在加载动画的例子
2019/11/14 Javascript
介绍Python中的fabs()方法的使用
2015/05/14 Python
Java Web开发过程中登陆模块的验证码的实现方式总结
2016/05/25 Python
python中defaultdict的用法详解
2017/06/07 Python
详解django中url路由配置及渲染方式
2019/02/25 Python
pytest中文文档之编写断言
2019/09/12 Python
Python新手如何进行闭包时绑定变量操作
2020/05/29 Python
python如何将图片转换素描画
2020/09/08 Python
美国现代家具和家居商店:Apt2B
2016/08/29 全球购物
运动会通讯稿300字
2014/02/02 职场文书
情人节活动总结范文
2015/02/05 职场文书
2016年国培研修日志
2015/11/13 职场文书
导游词之黄果树瀑布
2019/09/20 职场文书
详细聊聊关于Mysql联合查询的那些事儿
2021/10/24 MySQL
nginx内存池源码解析
2021/11/20 Servers
分享mysql的current_timestamp小坑及解决
2021/11/27 MySQL