必须校验路径越界并脱敏敏感日志:用Path.resolve()检查是否在允许根目录内,匹配password/token等字段时日志替换为。

避免用 exec 或 eval 处理外部输入的数据
数据修复脚本常要解析用户传入的表达式或配置,但直接喂给 exec 或 eval 就等于把 shell 交出去。哪怕只处理 CSV 中一列“计算公式”,攻击者也能塞进 __import__('os').system('rm -rf /')。
- 改用白名单函数 +
ast.literal_eval处理字面量(dict、list、数字、字符串),它不执行任意代码 - 真需要动态计算,用
numexpr或pandas.eval,它们限制作用域、禁用内置函数 - 如果必须用
eval,至少重置globals和locals,只暴露极少数安全函数,比如:{'abs': abs, 'round': round}
读写文件前必须校验路径是否越界
修复脚本常接受 --input 和 --output 路径参数,但没做规范化就直接拼接,容易被 ../../etc/passwd 绕过。Python 的 pathlib.Path 默认不拦截上层跳转。
- 用
pathlib.Path.resolve()获取绝对路径后,检查是否在允许根目录内:if not str(output_path).startswith(str(allowed_root)): - 避免用
os.path.join拼接用户输入——它不会清理../;改用Path.cwd() / user_input再.resolve() - Linux 下注意符号链接:即使路径在白名单内,
resolve()后仍可能指向外部,必要时用Path.samefile()校验真实位置
敏感字段默认不打印、不落日志
修复过程中若遇到含密码、token、身份证号的字段,脚本默认输出或写入 debug 日志,等于把密钥明文存硬盘。尤其当脚本跑在共享服务器或 CI 环境时,风险极高。
创建 Flask + Vue.js 全栈项目,采用单端口架构、uv 依赖管理、结构化日志和生产级前端设计。当用户要求以下操作时触发:创建新的 Flask+Vue 项目、搭建 Web 应用、构建全栈 Python+Vue 应用、初始化 Flask Web 项目、设置单端口 Flask 前后端项目。触发词:新建项目、创建项目、搭建项目、Flask项目、Vue项目。
- 用正则预扫描字段值,匹配到敏感模式(如
r'(?i)password|token|idcard')就跳过 print,日志中替换为<redacted></redacted> - 别依赖“只在本地跑”——加一层开关:
if not args.sensitive_logging:控制是否记录原始值 - 用
logging.handlers.RotatingFileHandler时设mode='w'防止旧日志残留敏感内容
用 tempfile 替代手动建临时文件
修复大文件时,常先写中间结果到 /tmp/fix_temp.csv,但硬编码路径有竞态和权限问题:多个实例可能覆盖彼此,或因 umask 导致临时文件可被同组用户读取。
立即学习“Python免费学习笔记(深入)”;
- 一律用
tempfile.NamedTemporaryFile(delete=False),它自动选安全路径、设 0600 权限、避免命名冲突 - 关闭文件句柄后再重命名:
temp_file.close(); os.replace(temp_file.name, final_path),保证原子写入 - Windows 下注意:不能在打开时重命名,所以
delete=False是必须的;Linux 下可用tempfile.mkstemp()配合os.fdopen

















