python - 有没有办法为 Python 的 eval 保护字符串?

标签 python security eval

关于在 不安全的字符串 上使用 Python 的 eval 有很多关于 SO 的问题(例如:Security of Python's eval() on untrusted strings?Python: make eval safe)。一致的回答是这是个坏主意。

但是,我发现关于哪些字符串可以被认为是安全的(如果有的话)的信息很少。 现在我想知道是否有可用的“安全字符串”定义(例如:仅包含小写 ascii 字符或任何符号 +-*/() 的字符串)。我发现的漏洞通常依赖于 _.,:[]'"等。这种方法是否安全(用于图形绘制 Web 应用程序)?

否则,我想使用 Alex Martelli 建议的解析包是唯一的方法。

编辑: 不幸的是,既没有答案可以令人信服地解释为什么/如何将上述字符串视为不安全(一个微小的工作漏洞),也没有相反的解释。我知道应该避免使用 eval,但这不是问题所在。因此,我将悬赏给第一个提出有效漏洞利用或很好地解释为什么如上所述损坏的字符串被认为(不)安全的人。

最佳答案

这里你有一个有效的“漏洞利用”,你的限制到位 - 只包含小写的 ascii 字符或任何符号 +-*/() 。 它依赖于第二个评估层。

def mask_code( python_code ):
    s="+".join(["chr("+str(ord(i))+")" for i in python_code])
    return "eval("+s+")"

bad_code='''__import__("os").getcwd()'''
masked= mask_code( bad_code )
print masked
print eval(bad_code)

输出:

eval(chr(111)+chr(115)+chr(46)+chr(103)+chr(101)+chr(116)+chr(99)+chr(119)+chr(100)+chr(40)+chr(41))
/home/user

这是一个非常微不足道的“利用”。我敢肯定还有无数其他人,即使有进一步的字符限制。 值得重申的是,人们应该始终使用解析器或 ast.literal_eval()。只有通过解析标记才能确保字符串可以安全评估。其他任何事情都在做空房子。

关于python - 有没有办法为 Python 的 eval 保护字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13066594/

相关文章:

python - 如何使用 panda 为推荐系统转换大型数据集?

python - sklearn "transport"训练模型的最佳实践

python - 在 Qt5 日历小部件中突出显示日期间隔

security - SSL:如何保护证书免受中间人攻击?

eval - Tcl:如何评估语句以在调用时填写默认参数

python - 为什么 Scipy 稀疏实现会返回错误数量的奇异值,而密集奇异值会返回正确的数量?

security - 音频文件的数字签名

ASP.NET Core appSettings.json 安全性

string - 如何评估 Access 查询中另一个字段中包含的字段名称?

perl - 使用 Perl 的 eval 时常见的陷阱是什么?