当前位置: 首页 > 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;请看思维导图。 编译…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

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

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

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

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

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

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...