Python的eval()在不受信任的字符串上的安全性?

17 浏览
0 Comments

Python的eval()在不受信任的字符串上的安全性?

如果我使用eval()评估一个Python字符串,并且有以下类:\n

class Foo(object):
    a = 3
    def bar(self, x): return x + a

\n如果我不信任这个字符串,会有哪些安全风险?具体而言:\n

    \n

  1. 使用`eval(string, {\"f\": Foo()}, {})`是不安全的吗?也就是说,可以通过Foo实例访问os或sys或其他不安全的内容吗?
  2. \n

  3. 使用`eval(string, {}, {})`是不安全的吗?也就是说,可以通过内置函数(如len和list)完全访问os或sys吗?
  4. \n

  5. 是否有办法在eval上下文中完全不包含内置函数?
  6. \n

\n有一些不安全的字符串,比如\"[0] * 100000000\",我不在意,因为最坏的情况下它们会使程序变慢或停止。我主要关注保护程序外的用户数据。\n显然,在大多数情况下,不带自定义字典的`eval(string)`是不安全的。

0
0 Comments

Python的eval()函数是一个强大而灵活的函数,它可以将字符串作为代码进行解析和执行。然而,当eval()函数用于执行不受信任的字符串时,会存在一些安全风险。

问题的出现主要是因为eval()函数的执行过程中存在安全漏洞,使得恶意用户可以通过构造恶意字符串来执行任意的代码,从而导致系统被攻击。这种安全漏洞可能会导致严重的后果,比如恶意代码的执行、数据泄漏等。

为了解决这个安全问题,可以采用以下方法之一:

1. 使用ast.literal_eval()函数替代eval()函数。ast.literal_eval()函数是Python标准库中的一个函数,它可以安全地解析和执行Python表达式,并返回结果。相比之下,eval()函数会执行任意的Python代码,因此更容易受到攻击。通过使用ast.literal_eval()函数,可以有效地避免eval()函数的安全风险。

2. 对输入字符串进行严格的过滤和验证。在使用eval()函数执行不受信任的字符串之前,应该对输入字符串进行严格的过滤和验证,以确保其中不包含恶意代码。可以使用正则表达式、字符串检查函数等方法来过滤和验证输入字符串,只允许符合特定格式或规则的字符串被解析和执行。

总之,eval()函数在执行不受信任的字符串时存在安全隐患。为了保护系统的安全性,应该采取相应的措施,如使用ast.literal_eval()函数替代eval()函数,并对输入字符串进行严格的过滤和验证。这样可以有效地防止恶意代码的执行,保护系统免受攻击。

0
0 Comments

Python的eval()函数是一个非常强大的函数,可以将字符串作为代码进行执行。然而,由于其强大的执行能力,eval()函数也带来了一些安全隐患。这篇文章将讨论eval()函数在处理不可信任字符串时的安全问题以及可能的解决方法。

在Python中,eval()函数可以执行任意的Python代码。这意味着如果我们允许不可信任的输入字符串作为eval()函数的参数,那么恶意用户可以利用这个函数来执行任意的恶意代码,从而导致严重的安全问题。例如,一个恶意用户可以构造一个字符串,使得eval()函数会导致解释器崩溃,或者获取任意类的访问权限。

因此,为了保护eval()函数的安全性,不能简单地使用黑名单的方法来阻止一些危险的输入字符串。这是因为黑名单方法只能列举出已知的危险字符串,而无法阻止新的未知的危险字符串。因此,黑名单方法并不可靠。

相反,更好的方法是使用白名单的方法来限制eval()函数的执行。白名单方法只允许特定的安全操作,而不是尝试阻止所有可能的危险操作。这样可以确保eval()函数只能执行安全的操作,而不会执行任意的恶意代码。

一个常见的白名单方法是使用ast模块来解析输入的字符串,并检查其语法结构。通过检查语法结构,我们可以确定输入字符串是否只包含安全的操作。如果输入字符串中存在不安全的操作,我们可以拒绝执行eval()函数。

下面是一个示例代码,演示了如何使用ast模块来实现白名单方法:

import ast
def safe_eval(expression):
    try:
        parsed = ast.parse(expression, mode='eval')
        if isinstance(parsed, ast.Expression):
            return eval(compile(parsed, filename='', mode='eval'))
    except:
        pass
    raise ValueError('Invalid expression')
# 安全地执行eval()函数
result = safe_eval('2 + 2')
print(result)  # 输出: 4
# 尝试执行恶意代码
result = safe_eval('__import__("os").system("rm -rf /")')
print(result)  # 输出: ValueError: Invalid expression

在上面的代码中,我们定义了一个safe_eval()函数,它使用ast模块来解析输入字符串,并检查其语法结构。如果输入字符串只包含安全的操作,我们将执行eval()函数并返回结果。否则,我们将引发一个ValueError异常,表示输入字符串无效。

总之,Python的eval()函数是一个非常强大的函数,但也存在安全隐患。为了保护eval()函数的安全性,我们不能简单地使用黑名单方法来阻止危险的输入字符串,而应该使用白名单方法来限制eval()函数的执行。通过使用ast模块解析输入字符串并检查其语法结构,我们可以确保eval()函数只执行安全的操作,从而减少安全风险的发生。

0
0 Comments

Python中的`eval()`函数存在安全风险,可能会导致恶意数据入侵整个系统。最近在python-dev列表中有关于如何安全地执行这种操作的讨论,结论如下:

  • 这确实很难做到。
  • 需要对Python解释器进行补丁以阻止多种攻击。
  • 除非你真的想要这样做,否则不要使用。

可以从这里开始阅读有关这个挑战的内容:http://tav.espians.com/a-challenge-to-break-python-security.html

你想在什么情况下使用`eval()`?你是想让用户能够执行任意表达式吗?还是想以某种方式传输数据?也许可以以某种方式限制输入。

Lott - 安全背后的一个主要思想不是预防坏事情发生而不是事后希望你能够识别攻击者并说服他们不再这样做吗?为什么要打击良好的实践呢?

任何情况下,如果一个人在互联网上编写不受信任的代码来在你的系统上运行,就需要确保这些不受信任的人无法进行攻击。“这个人是谁”- 如果你使用`eval()`编写了不安全的代码,而我知道了,那么就是我向你展示你不应该这样做。

0