问题

想要将一段列表形式的字符串转为 list,但是担心这个动态的字符串可能是恶意的代码?使用 eval 将带来安全隐患。比如:

# 期望是
eval('[1, 2, 3]') # 实际上是
eval("os.popen('rm -rf *')")

解决方案

使用 ast.literal_eval 可以很好的避免这个问题,该函数可以安全执行仅包含文字的表达式字符串。支持的对象有字符串、字节、数字、元组、列表、字典、集合、 布尔值、NoneEllipsis。这些是可以嵌套的,比如以字典作为元素的列表:

>>> from ast import literal_eval
>>> literal_eval("[{'name': 'john', 'location': 'halo7'}]")
[{'name': 'john', 'location': 'halo7'}]

注意 literal_eval 不可以执行任何复杂的表达式,比如包含运算符或是有索引的表达式都是不支持的,会直接抛出异常。这也保证了它不会执行恶意代码。

拓展

  • 使用 literal_eval 时,足够复杂或是巨大的字符串可能导致 Python 解释器的崩溃,因为 Python 的 AST 编译器是有栈深限制的
  • literal_eval 解析异常时,可能会抛出 ValueError, TypeError, SyntaxError, MemoryErrorRecursionError,这取决于传入的字符串

最新文章

  1. Oracle 查询语句(where,order by ,like,in,distinct)
  2. mac下有道词典用不了
  3. 解决Django和EasyUI搭配使用时出现的CSRF问题
  4. wampserver,eclipse,PHPeclipse搭建php开发环境
  5. 拉动滚动条追加内容,无限延伸document高度 $(window).scroll(function(){if($(window).scrollTop() + $(window).height() == $(document).height()) { $("body").append(html) } })
  6. perl 调用方法 子例程说明
  7. Activity组件的生命周期
  8. mongodb.conf
  9. C 小问题集锦
  10. 【bzoj1552】[Cerc2007]robotic sort
  11. ●BZOJ 2393 Cirno的完美算数教室
  12. idea 15安装步骤2017.6.25
  13. mysql查看索引与锁
  14. Codeforces.1139D.Steps to One(DP 莫比乌斯反演)
  15. jmeter在几个固定的字符串中,随机取其中之一的方法
  16. luogu P2480 [SDOI2010]古代猪文
  17. revit api 实现过滤墙图元并选中
  18. 二维RMQ模板
  19. lseek使用说明
  20. zabbix snmp 协议监控 dell iRDAC

热门文章

  1. Docker Compose 容器编排 NET Core 6+MySQL 8+Nginx + Redis
  2. [luogu5344]逛森林
  3. [luogu3334]抛硬币
  4. JAVA后端方面,如何快速达到能实习的程度
  5. 【Tool】IDEA功能--SVN和Git
  6. vip视频解析保存
  7. Go语言核心36讲(Go语言实战与应用十四)--学习笔记
  8. python网络自动化运维之环境搭建(EVE-NG+pycharm)
  9. 如何使用csapp文件
  10. mac 下 如何在同一窗口打开多个终端并实现快捷键切换