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

2024-01-19

关于使用Python的eval有很多问题不安全的字符串 (eg.: Python eval() 在不受信任的字符串上的安全性? https://stackoverflow.com/questions/661084/security-of-pythons-eval-on-untrusted-strings, Python:使 eval 安全 https://stackoverflow.com/questions/3513292/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)

output:

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()。只有通过解析标记才能确保字符串可以安全地求值。其他任何事情都是对赌庄。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法保护Python eval 的字符串? 的相关文章

随机推荐

  • Angular 2,设置默认值以选择选项

    我尝试为选项添加默认值 它就像一种占位符 我使用这个方法 https stackoverflow com questions 5805059 how do i make a placeholder for a select box去做吧 在
  • 混合 C++ ABI 以针对遗留库进行构建

    情况是这样的 我有一个使用最新 GCC 4 3 3 的 C 代码库 但我需要链接到使用 GCC 3 2 3 构建的旧库 该库没有可用的新版本 我不能没有它 而且它是闭源的 因此无法重建 这似乎造成了一个问题 因为 GCC 4 3 3 和 3
  • 用 PHP 编译带有多个附件的电子邮件

    我需要从 PHP 发送一封包含多个图像附件的电子邮件 我目前有一个使用两个硬编码图像的测试设置 我用所有必要的标题编译电子邮件并将其发送出去 但是 当我收到它时 它只显示第一张图片作为附件 第二张图片似乎被忽略了 使用 Groupwise
  • 将关联数组变成类似于 Eloquent 查询集合的集合

    我有一个正在接收 API 数据的类 我想将所有响应包装到一个集合类中 因此 我从 API 调用接收数据 将其转换为普通的关联 php 数组 并使用collect helper 我本以为它能像 Eloquent 一样工作 你可以将键引用为集合
  • 如何使用 Selenium Web 驱动程序上传文件/处理窗口

    我正在尝试自动化一个场景 在该场景中我必须上传文档 但我无法处理上传文件一旦我单击网络应用程序上的 选择文件 按钮 就会出现窗口 我使用的是 C 语言和 Chrome 浏览器 我的 C 测试用例 Test Description JAVA
  • ARM 模板部署不会删除旧管道

    我正在使用 ARM 模板部署我的数据工厂 当我删除管道时 旧版本不会从目标环境中删除 重命名也会发生同样的情况 我的目标环境包含一个具有旧名称的管道和一个具有新名称的管道 如何删除带有 ARM 模板部署的旧管道 注意 我只想删除数据工厂内的
  • Mathematica 中的树数据结构

    我主要使用mathematica 作为数学工作台和编写相对较小的临时程序 然而 我正在设计一个系统 打算在 Mathematica 中编程 我需要将数据存储在树中 并搜索和遍历树 尽管我知道如何实现树 但我更喜欢标准的 经过测试的代码 我在
  • Spring:正确设置@ComponentScan

    我为我的设置进行了以下设置Spring Application Context Configuration public class RmiContext Bean public RmiProxyFactoryBean service Rm
  • 可空类型“int”的默认值是多少? (包括问号)?

    在C 中 类型的类实例变量的默认值是多少int 例如 在下面的代码中 什么值将MyNullableInt如果从未明确分配的话有吗 class MyClass public int MyNullableInt 看来答案几乎肯定是null or
  • 无法删除表用户,因为其他对象依赖于它

    我想将我的表删除到数据库中 但是 当我使用时 例如 DROP TABLE if exists users 我收到这条消息 cannot drop table users because other objects depend on it
  • Laravel 路由不调用控制器的功能

    我在页面 刀片 中有一个表单 它重定向到一个路由 该路由要调用控制器中的函数 但它甚至不会进入函数内部 因为即使是简单的 dd 不能被执行 在途中 如果我更改为 Route post edit profile function Reques
  • 无法使用自定义样式编织为 pdf

    尝试使用自定义 mystyles sty 文件从 RStudio 编织为 pdf 这曾经工作正常 但现在我已经升级到 RStudio 1 044 我收到错误 Example title Test output pdf document in
  • 分析(可能受 I/O 限制)进程以减少延迟

    我想提高大型应用程序中特定方法的性能 目标是改善延迟 特定功能所花费的挂钟时间 而不是 必然 系统负载 要求 由于我预计大部分延迟是由 I O 造成的 因此请考虑等待 阻塞所花费的时间 换句话说 查看挂钟时间而不是 CPU 时间 由于该程序
  • 已解析的依赖项中存在不兼容的版本

    我正在尝试运行我的 python 项目 该项目似乎在我的 Mac 上运行良好 在 pycharm 中最好 不太好 但可以在 VSCode 中运行 但在 VSCode 中的树莓派上运行得很糟糕 每当我运行pipenv shell然后一个pip
  • StepFunction 的 Choice 规则检查数组字段是否为空

    有没有办法在 Step Function 中创建选择规则来确定数组字段是否有元素 当前 StepFunction 文档 https docs aws amazon com step functions latest dg amazon st
  • 在 C 和 C++ 中 main() 应该返回什么?

    定义的正确 最有效 方法是什么main C 和 C 中的函数 int main or void main 为什么 那么论点又如何呢 如果int main then return 1 or return 0 返回值为main指示程序如何退出
  • 使用蓝牙在其他 iOS 设备上拍照

    如果有 iOS 蓝牙经验的人可以向我展示如何使用蓝牙类在其他 iOS 设备上拍照 我将不胜感激 该应用程序允许用户登录 注册 然后拍摄并上传照片 http www raywenderlich com 13511 how to create
  • 使用 PHP 将特殊字符转换为普通字符,例如将 ã、é、ç 转换为 a、e、c [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想使用 PHP 将特殊字符转换为普
  • UNIX 命令 mv 和 rm 如何处理打开的文件?

    如果我正在读取存储在 NTFS 文件系统上的文件 并且尝试在读取该文件时移动 重命名该文件 我将无法这样做 如果我在 UNIX 文件系统 例如 EXT3 上尝试此操作 它会成功 并且执行读取的进程不受影响 我什至可以 rm 文件并且读取过程
  • 有没有办法保护Python eval 的字符串?

    关于使用Python的eval有很多问题不安全的字符串 eg Python eval 在不受信任的字符串上的安全性 https stackoverflow com questions 661084 security of pythons e