【Python】 ast.literal_eval 与 eval
一、背景
我在在编写管理后台的过程中,遇到一个小问题,是关于用户名的存储和解码。用户名以base64编码的形式存储在 MySQL 数据库中,并且还保留了b''这样的形式,具体为什么要这样存我也不知道,可能是因为有些特殊字符无法直接存储。当从数据库中查询出数据后,为了正确使用这些用户名,需要进行解码操作。然而,base64.b64decode()方法接收的是bytes类型的数据。
也就是说,我们面临着将一个形如"b'huisqhfqe21aGVsbG8='"的字符串转换成b'huisqhfqe21aGVsbG8='这样的bytes类型数据的任务。在思考解决方案的过程中,eval方法首先浮现在脑海中,但考虑到安全性问题,经过查阅资料后,最终决定选择使用ast.literal_eval。虽然这里其实没什么风险,但是我就是想用 QAQ
二、base64 简介
Base64 是一种用于将二进制数据编码成 ASCII 字符的编码方式。它通常用于在网络传输或存储数据时,将二进制数据转换为可打印的字符,以便于传输和存储。在 Python 中,可以使用base64模块来进行 Base64 编码和解码操作。
import base64
def base64_to_string(base64_data):decoded_data = base64.b64decode(base64_data)string_data = decoded_data.decode('utf-8')return string_datadef string_to_base64(string_data):encoded_data = str.encode(string_data, 'utf-8')base64_data = base64.b64encode(encoded_data)return base64_data
三、eval
- 功能与用法
eval函数是 Python 中一个强大的工具,它可以将一个字符串表达式作为 Python 代码进行执行。例如:expression = "2 + 3" result = eval(expression) print(result) # 5- 它可以处理各种复杂的表达式,包括数学运算、函数调用等。例如:
eval("pow(2, 3)") # 8
- 安全风险
- 然而,
eval的强大功能也伴随着巨大的安全风险。如果输入的字符串来自不可信的来源,比如用户输入、网络传输的数据等,那么这个字符串可能会被恶意构造来执行恶意代码。 - 例如,假设一个恶意用户输入了以下字符串:
执行这段代码将导致严重的系统破坏,可能会删除整个文件系统。malicious_str = "os.system('rm -rf /')" eval(malicious_str) - 此外,
eval还可能导致代码注入攻击,使得攻击者能够执行任意的 Python 代码,获取敏感信息或者控制系统。
- 然而,
- 性能开销
eval函数在执行时需要解析和执行字符串中的代码,这会带来一定的性能开销。特别是在处理大量数据或者频繁调用的情况下,这种性能开销可能会变得比较明显。
四、ast.literal_eval
- 功能与用法
ast.literal_eval是一个相对安全的评估函数,它仅接受字符串形式的 Python 字面量表达式,并将其转换为相应的 Python 对象。- 在上述场景中,可以使用
ast.literal_eval来将特定的字符串转换为bytes类型的对象。例如:import ast literal_str = "b'huisqhfqe21aGVsbG8='" result = ast.literal_eval(literal_str) print(result)
- 安全性保障
ast.literal_eval具有严格的语法要求,只接受有限的字面量表达式,如数字、字符串、列表、元组、字典等。这意味着它不会执行任意的代码,从而大大降低了安全风险。- 如果输入的字符串不符合 Python 字面量的语法规则,它将抛出一个
ValueError异常,而不是执行潜在的恶意代码。
- 性能特点
- 虽然
ast.literal_eval在安全性方面有很大的优势,但在性能上可能略逊于eval。不过,这种性能差异通常在大多数应用场景下并不显著,而且为了保证程序的安全性,这点性能损失是可以接受的。
- 虽然
五、实际应用场景对比
- 在数据处理管道中,如果需要对从外部数据源获取的字符串进行转换,使用
ast.literal_eval可以确保数据的安全性。例如,从一个不可信的 API 接口获取的数据,需要转换为 Python 对象进行进一步处理时,ast.literal_eval是更好的选择。 - 而在一些内部开发的工具或者脚本中,如果输入的字符串是由开发者自己控制的,并且已经经过了严格的验证,那么使用
eval可能会更加方便快捷。但即使在这种情况下,也应该谨慎使用,并充分考虑潜在的安全风险。 - 在涉及到用户交互的应用程序中,绝对不能使用
eval来处理用户输入的字符串。因为用户可能会输入恶意代码,从而导致严重的安全问题。而ast.literal_eval则可以在一定程度上保证用户输入的安全性,只要用户输入的字符串符合字面量语法规则。
六、使用建议
- 优先选择 ast.literal_eval
- 在实际编程中,如果需要将一个已知安全的、符合字面量语法规则的字符串转换为 Python 对象,应优先使用
ast.literal_eval。ast.literal_eval是一个安全可靠的选择。它可以有效地避免恶意代码的注入,保护程序的安全性。
- 在实际编程中,如果需要将一个已知安全的、符合字面量语法规则的字符串转换为 Python 对象,应优先使用
- 谨慎使用 eval
- 除非完全信任输入的字符串并且明确知道执行的代码是安全的,否则应避免使用
eval。在大多数情况下,都有更安全的替代方法来实现所需的功能。 - 如果确实需要使用
eval,应该对输入的字符串进行严格的验证和过滤,以确保不会执行恶意代码。例如,可以使用正则表达式来检查字符串是否只包含合法的表达式。
- 除非完全信任输入的字符串并且明确知道执行的代码是安全的,否则应避免使用
相关文章:
【Python】 ast.literal_eval 与 eval
一、背景 我在在编写管理后台的过程中,遇到一个小问题,是关于用户名的存储和解码。用户名以base64编码的形式存储在 MySQL 数据库中,并且还保留了b这样的形式,具体为什么要这样存我也不知道,可能是因为有些特殊字符无法直接存储。…...
Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 新一代垃圾回收器 ZGC 收集器
文章目录 垃圾回收机制垃圾收集器垃圾收集器分类ZGC 收集器ZGC 的性能优势复制算法指针染色读屏障 ZGC 的工作过程Stop-The-World 暂停阶段并发阶段 垃圾回收机制 垃圾回收(Garbage Collection,GC),顾名思义就是释放垃圾占用的空…...
基于 K8S kubernetes 的常见日志收集方案
目录 1、日志对我们来说到底重不重要? 2、常见的日志收集方案 2.1 EFK 2.2 ELK Stack 2.3 ELKfilebeat 2.4 其他方案 2、elasticsearch组件介绍 3、filebeat组件介绍 3.1 filebeat和beat关系 3.2 filebeat是什么? 3.3 Filebeat工作原理 3.4 …...
Unity3D 小案例 像素贪吃蛇 02 蛇的觅食
Unity3D 小案例 像素贪吃蛇 第二期 蛇的觅食 像素贪吃蛇 食物生成 在场景中创建一个 2D 正方形,调整颜色,添加 Tag 并修改为 Food。 然后拖拽到 Assets 文件夹中变成预制体。 创建食物管理器 FoodManager.cs,添加单例,可以设置…...
【sgCreateCallAPIFunction】自定义小工具:敏捷开发→调用接口方法代码生成工具
<template><div :class"$options.name" class"sgDevTool"><sgHead /><div class"sg-container"><div class"sg-start"><div style"margin-bottom: 10px">调用接口方法定义列表</div…...
京东商品详情的 API 探秘与应用
在当今数字化的商业世界中,获取准确而详细的商品信息对于开发者、商家以及消费者都具有至关重要的意义。京东作为国内领先的电商平台之一,提供了丰富的商品资源和强大的 API 接口,让我们能够轻松获取京东商品的详情信息。本文将带你深入了解如…...
功能测试干了三年,快要废了。。。
8年前刚进入到IT行业,到现在学习软件测试的人越来越多,所以在这我想结合自己的一些看法给大家提一些建议。 最近聊到软件测试的行业内卷,越来越多的转行和大学生进入测试行业,导致软件测试已经饱和了,想要获得更好的待…...
【C++】多态的认识和理解
个人主页 文章目录 ⭐一、多态的概念🎄二、多态的定义及实现1.多态的构成2.实现多态的条件3.虚函数的概念4.虚函数的重写和覆盖5.析构函数的重写6.协变7.override和 final关键字8.重载、重写/覆盖、隐藏这三者的区别 🏠三、纯虚函数和抽象类的关系&#…...
linux-安全管理-用户认证
Linux 安全管理:用户认证 一、概述 用户认证是 Linux 安全管理的核心部分,确保系统能够识别并验证合法用户,同时阻止未经授权的访问。Linux 提供了多种用户认证机制,包括用户名和密码认证、基于密钥的认证、双因素认证ÿ…...
webpack5 构建优化方案看这篇就够了!【Node.js进阶】
无论在面试还是内部晋升,webpack 构建优化方案 一直都是非常重要的部分。 webpack5构建加持 一、项目完成目标二、搭建项目1. 安装koa、koa/router (如果已经配置可路过)2. 创建入口文件3. 安装构建依赖4. 在项目根目录添加 .babelrc 文件5. …...
esp32-C2 对接火山引擎实现智能语音(一)
目录 一、火山引擎大模型简介 1)火山引擎网址: 2)首先需要先注册火山引擎账号 3)语音识别——即语音转为文本 一句话识别 流式语音识别 录音文件识别标准版 录音文件识别极速版 4)语音合成——文本转音频 一、火山引擎大模型简介 火山引擎的智能语音技术,基于业界先…...
【MySQL-初级】mysql基础操作(账户、数据库、表的增删查改)
概述 数据备份与恢复 数据库备份:在cmd下 root用户:sudo mysqldump -u root -p Test > Test.sql普通用户:mysqldump -u zzz -p db_name > db_name.sql 数据库恢复 先创建一个空的数据库在cmd下:sudo mysql -u root -p d…...
centos bash脚本一键运行安装go环境
复制到install_go.sh直接bash install_go.sh运行就完了 echo ----------安装go环境 wget https://go.dev/dl/go1.21.13.linux-amd64.tar.gz tar -zxvf go1.21.13.linux-amd64.tar.gzmkdir /srv cp -r go /srv/echo "PATH$PATH:/srv/go/bin ">> ~/.bashrc echo…...
vue2制作高复用页面
记录一下页面搭建记录,利用vue2组件化开发的思想。这个页面适合于大部分信息管理系统~。模板固定,每次使用,直接修改表单表格参数,api接口等。 以上图页面为例,一个基础数据信息页面可以分为,分类ÿ…...
Feed流系统重构:架构篇
重构对我而言,最大的乐趣在于解决问题。我曾参与一个C#彩票算奖系统的重构,那时系统常因超时引发用户投诉。接手任务时,我既激动又紧张,连续两天几乎废寝忘食地编码。结果令人振奋,算奖时间从一小时大幅缩短至十分钟。…...
Android 后台服务之Persistent 属性
在 Android 开发中,有时我们需要后台服务持续运行,以保持应用的某些功能。例如,音乐播放器需要在后台播放音乐,或者健康应用需要持续跟踪用户的运动数据。后台服务是 Android 中的一种组件,它不与用户界面交互,能够在后台执行长时间运行的任务。由于 Android 系统的资源管…...
STM32+ESP01连接到机智云
机智云,全球领先的智能硬件软件自助开发及物联网(iot)云服务平台。机智云平台为开发者提供了自助式智能硬件开发工具与开放的云端服务。通过傻瓜化的自助工具、完善的SDK与API服务能力最大限度降低了物联网硬件开发的技术门槛,降低开发者的研发成本,提升…...
电脑实时监控软件有哪些?七个电脑屏幕监控软件任你选择
电脑实时监控软件种类繁多,每款软件都有其独特的功能和适用场景。 以下是七个备受推荐的电脑屏幕监控软件,供您选择: 1.安企神: 功能:它是一款国内领先的企业级电脑监控解决方案, 提供实时屏幕监控、 文…...
信奥学习规划(CSP-J/S)
CSP-J组学习路线规划 CSP-S组学习规划...
【Linux取经之路】编译器gcc/g++的使用 调试器gdb的使用
目录 背景知识 编译器gcc/g的安装 编译器gcc/g的使用 调试器gdb的使用 cgdb 条件断点 背景知识 子曰:“温故而知新”。在谈gcc/g的使用之前,我们先来复习编译的4个阶段,也算是为下面的内容做一些铺垫,请看思维导图。 编译…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
