讲师中心 微信公众号
AI工具推荐 视频效率加速

Python 不可信输入的安全处理方式

千明酱_4080

千明酱_4080

发布时间:2026-02-16 15:29:25

|

874人浏览过

|

来源于php中文网

原创

应使用 ast.literal_eval 替代 eval 解析用户字符串,因其仅支持基础字面量;路径需用 pathlib.Path.resolve() 归一化并校验根目录;subprocess 禁用 shell=True;JSON 解析须用 object_hook 限制嵌套深度。

python 不可信输入的安全处理方式

用 ast.literal_eval 替代 eval 解析字符串数据

直接调 eval 执行用户给的字符串,等于把 shell 交出去——哪怕只传了个 "[1, 2, 3]",攻击者也能塞进 __import__('os').system('rm -rf /')。而 ast.literal_eval 只认基础字面量:数字、字符串、列表、字典、元组、布尔和 None,遇到函数调用或属性访问直接抛 ValueError。

  • 适用场景:解析用户提交的 JSON-like 字符串(如配置项、过滤条件),但又不想引入完整 JSON 解析器
  • 注意它不支持单引号字符串以外的语法变体,比如 "{'a': 1}" 合法,"{a: 1}"(没引号的 key)会报错
  • 性能上比 json.loads 略慢,但胜在能处理单引号和末尾逗号等 Python 原生语法
  • 示例:
    import ast
    user_input = "{'name': 'Alice', 'scores': [95, 87]}"
    data = ast.literal_eval(user_input)  # ✅ 安全
    # user_input = "__import__('sys').exit()"  # ❌ literal_eval 直接 ValueError

接收文件路径时必须用 pathlib.Path.resolve() 校验

用户传个 "../../etc/passwd" 就读到系统文件?问题出在没做路径归一化和根目录约束。光靠字符串替换 ".." 或正则过滤远远不够,符号链接、大小写混用、Unicode 归一化都会绕过。

  • 先用 Path(user_path).resolve() 得到绝对真实路径,再检查是否落在允许目录下
  • 务必捕获 FileNotFoundError 和 PermissionError,因为 resolve() 在路径不存在或不可读时会抛异常
  • 别依赖 os.path.abspath(),它不处理符号链接,且不校验路径是否存在
  • 示例:
    from pathlib import Path
    allowed_root = Path("/var/www/uploads")
    user_path = Path("../.ssh/id_rsa")
    try:
        real_path = user_path.resolve()
        if not str(real_path).startswith(str(allowed_root)):
            raise PermissionError("Path outside allowed directory")
    except (FileNotFoundError, PermissionError):
        raise ValueError("Invalid or inaccessible path")

用 subprocess.run 传参时禁用 shell=True

用户输入拼进命令字符串再 shell=True 执行,是远程代码执行(RCE)的黄金入口。哪怕加了 shlex.quote,不同 shell 的行为差异、环境变量注入、空格与 Unicode 边界问题仍可能翻车。

macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

下载
  • 永远把命令拆成列表:["ls", "-l", user_supplied_filename],让 subprocess 自己做参数传递
  • 如果非得用 shell 功能(比如管道、通配符),必须先用 shlex.split() 解析原始字符串,再逐项 shlex.quote(),但强烈不建议
  • cwd、env、timeout 这些参数要显式设好,避免继承危险环境
  • 错误现象:用户输 "; rm -rf /" 导致整个磁盘被清空

JSON 解析必须指定 object_hook 防止递归爆炸

恶意构造的超深嵌套 JSON(比如 10 万层字典套字典)会让 json.loads 占满栈内存甚至触发 C 层递归限制,导致服务崩溃。Python 默认不限制嵌套深度,这是个隐形炸弹。

立即学习“Python免费学习笔记(深入)”;

  • 用 object_hook 回调函数,在每次构建 dict 时检查当前层级,超限就抛异常
  • 别信 sys.setrecursionlimit(),它治标不治本,还可能影响其他逻辑
  • 第三方库如 orjson 默认更严格,但原生 json 必须手动加固
  • 示例:
    import json
    def guard_depth(obj):
        if isinstance(obj, dict):
            # 实际中可从闭包或上下文获取当前深度
            if len(obj) > 1000:  # 防止超大对象
                raise ValueError("Too many keys in object")
        return obj
    <p>json.loads(user_json, object_hook=guard_depth)

事情说清了就结束。最常被忽略的是路径校验后没检查符号链接跳转、JSON 深度限制写死在回调里却忘了传入实际层级计数、还有人以为 ast.literal_eval 能安全处理带注释的 Python 字面量——它不能。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2255

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3642

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1216

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

4199

2025.09.10

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1858

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

3004

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6284

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

6249

2023.11.24

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

0

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn