当前位置: 首页 > news >正文

【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

  1. 功能与用法
    • eval函数是 Python 中一个强大的工具,它可以将一个字符串表达式作为 Python 代码进行执行。例如:
      expression = "2 + 3"
      result = eval(expression)
      print(result)  # 5
      
    • 它可以处理各种复杂的表达式,包括数学运算、函数调用等。例如:
      eval("pow(2, 3)")  # 8
      
  2. 安全风险
    • 然而,eval的强大功能也伴随着巨大的安全风险。如果输入的字符串来自不可信的来源,比如用户输入、网络传输的数据等,那么这个字符串可能会被恶意构造来执行恶意代码。
    • 例如,假设一个恶意用户输入了以下字符串:
      malicious_str = "os.system('rm -rf /')"
      eval(malicious_str)
      
      执行这段代码将导致严重的系统破坏,可能会删除整个文件系统。
    • 此外,eval还可能导致代码注入攻击,使得攻击者能够执行任意的 Python 代码,获取敏感信息或者控制系统。
  3. 性能开销
    • eval函数在执行时需要解析和执行字符串中的代码,这会带来一定的性能开销。特别是在处理大量数据或者频繁调用的情况下,这种性能开销可能会变得比较明显。

四、ast.literal_eval

  1. 功能与用法
    • ast.literal_eval是一个相对安全的评估函数,它仅接受字符串形式的 Python 字面量表达式,并将其转换为相应的 Python 对象。
    • 在上述场景中,可以使用ast.literal_eval来将特定的字符串转换为bytes类型的对象。例如:
      import ast
      literal_str = "b'huisqhfqe21aGVsbG8='"
      result = ast.literal_eval(literal_str)
      print(result)
      
  2. 安全性保障
    • ast.literal_eval具有严格的语法要求,只接受有限的字面量表达式,如数字、字符串、列表、元组、字典等。这意味着它不会执行任意的代码,从而大大降低了安全风险。
    • 如果输入的字符串不符合 Python 字面量的语法规则,它将抛出一个ValueError异常,而不是执行潜在的恶意代码。
  3. 性能特点
    • 虽然ast.literal_eval在安全性方面有很大的优势,但在性能上可能略逊于eval。不过,这种性能差异通常在大多数应用场景下并不显著,而且为了保证程序的安全性,这点性能损失是可以接受的。

五、实际应用场景对比

  1. 在数据处理管道中,如果需要对从外部数据源获取的字符串进行转换,使用ast.literal_eval可以确保数据的安全性。例如,从一个不可信的 API 接口获取的数据,需要转换为 Python 对象进行进一步处理时,ast.literal_eval是更好的选择。
  2. 而在一些内部开发的工具或者脚本中,如果输入的字符串是由开发者自己控制的,并且已经经过了严格的验证,那么使用eval可能会更加方便快捷。但即使在这种情况下,也应该谨慎使用,并充分考虑潜在的安全风险。
  3. 在涉及到用户交互的应用程序中,绝对不能使用eval来处理用户输入的字符串。因为用户可能会输入恶意代码,从而导致严重的安全问题。而ast.literal_eval则可以在一定程度上保证用户输入的安全性,只要用户输入的字符串符合字面量语法规则。

六、使用建议

  1. 优先选择 ast.literal_eval
    • 在实际编程中,如果需要将一个已知安全的、符合字面量语法规则的字符串转换为 Python 对象,应优先使用ast.literal_evalast.literal_eval是一个安全可靠的选择。它可以有效地避免恶意代码的注入,保护程序的安全性。
  2. 谨慎使用 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 探秘与应用

在当今数字化的商业世界中&#xff0c;获取准确而详细的商品信息对于开发者、商家以及消费者都具有至关重要的意义。京东作为国内领先的电商平台之一&#xff0c;提供了丰富的商品资源和强大的 API 接口&#xff0c;让我们能够轻松获取京东商品的详情信息。本文将带你深入了解如…...

功能测试干了三年,快要废了。。。

8年前刚进入到IT行业&#xff0c;到现在学习软件测试的人越来越多&#xff0c;所以在这我想结合自己的一些看法给大家提一些建议。 最近聊到软件测试的行业内卷&#xff0c;越来越多的转行和大学生进入测试行业&#xff0c;导致软件测试已经饱和了&#xff0c;想要获得更好的待…...

【C++】多态的认识和理解

个人主页 文章目录 ⭐一、多态的概念&#x1f384;二、多态的定义及实现1.多态的构成2.实现多态的条件3.虚函数的概念4.虚函数的重写和覆盖5.析构函数的重写6.协变7.override和 final关键字8.重载、重写/覆盖、隐藏这三者的区别 &#x1f3e0;三、纯虚函数和抽象类的关系&#…...

linux-安全管理-用户认证

Linux 安全管理&#xff1a;用户认证 一、概述 用户认证是 Linux 安全管理的核心部分&#xff0c;确保系统能够识别并验证合法用户&#xff0c;同时阻止未经授权的访问。Linux 提供了多种用户认证机制&#xff0c;包括用户名和密码认证、基于密钥的认证、双因素认证&#xff…...

webpack5 构建优化方案看这篇就够了!【Node.js进阶】

无论在面试还是内部晋升&#xff0c;webpack 构建优化方案 一直都是非常重要的部分。 webpack5构建加持 一、项目完成目标二、搭建项目1. 安装koa、koa/router &#xff08;如果已经配置可路过&#xff09;2. 创建入口文件3. 安装构建依赖4. 在项目根目录添加 .babelrc 文件5. …...

esp32-C2 对接火山引擎实现智能语音(一)

目录 一、火山引擎大模型简介 1)火山引擎网址: 2)首先需要先注册火山引擎账号 3)语音识别——即语音转为文本 一句话识别 流式语音识别 录音文件识别标准版 录音文件识别极速版 4)语音合成——文本转音频 一、火山引擎大模型简介 火山引擎的智能语音技术,基于业界先…...

【MySQL-初级】mysql基础操作(账户、数据库、表的增删查改)

概述 数据备份与恢复 数据库备份&#xff1a;在cmd下 root用户&#xff1a;sudo mysqldump -u root -p Test > Test.sql普通用户&#xff1a;mysqldump -u zzz -p db_name > db_name.sql 数据库恢复 先创建一个空的数据库在cmd下&#xff1a;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制作高复用页面

记录一下页面搭建记录&#xff0c;利用vue2组件化开发的思想。这个页面适合于大部分信息管理系统~。模板固定&#xff0c;每次使用&#xff0c;直接修改表单表格参数&#xff0c;api接口等。 以上图页面为例&#xff0c;一个基础数据信息页面可以分为&#xff0c;分类&#xff…...

Feed流系统重构:架构篇

重构对我而言&#xff0c;最大的乐趣在于解决问题。我曾参与一个C#彩票算奖系统的重构&#xff0c;那时系统常因超时引发用户投诉。接手任务时&#xff0c;我既激动又紧张&#xff0c;连续两天几乎废寝忘食地编码。结果令人振奋&#xff0c;算奖时间从一小时大幅缩短至十分钟。…...

Android 后台服务之Persistent 属性

在 Android 开发中,有时我们需要后台服务持续运行,以保持应用的某些功能。例如,音乐播放器需要在后台播放音乐,或者健康应用需要持续跟踪用户的运动数据。后台服务是 Android 中的一种组件,它不与用户界面交互,能够在后台执行长时间运行的任务。由于 Android 系统的资源管…...

STM32+ESP01连接到机智云

机智云,全球领先的智能硬件软件自助开发及物联网(iot)云服务平台。机智云平台为开发者提供了自助式智能硬件开发工具与开放的云端服务。通过傻瓜化的自助工具、完善的SDK与API服务能力最大限度降低了物联网硬件开发的技术门槛&#xff0c;降低开发者的研发成本&#xff0c;提升…...

电脑实时监控软件有哪些?七个电脑屏幕监控软件任你选择

电脑实时监控软件种类繁多&#xff0c;每款软件都有其独特的功能和适用场景。 以下是七个备受推荐的电脑屏幕监控软件&#xff0c;供您选择&#xff1a; 1.安企神&#xff1a; 功能&#xff1a;它是一款国内领先的企业级电脑监控解决方案&#xff0c; 提供实时屏幕监控、 文…...

信奥学习规划(CSP-J/S)

CSP-J组学习路线规划 CSP-S组学习规划...

【Linux取经之路】编译器gcc/g++的使用 调试器gdb的使用

目录 背景知识 编译器gcc/g的安装 编译器gcc/g的使用 调试器gdb的使用 cgdb 条件断点 背景知识 子曰&#xff1a;“温故而知新”。在谈gcc/g的使用之前&#xff0c;我们先来复习编译的4个阶段&#xff0c;也算是为下面的内容做一些铺垫&#xff0c;请看思维导图。 编译…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...