本地运行含数据库连接串的Python文件是否存在安全漏洞?
本地运行Python MySQL导入脚本的安全风险与最优实践
硬编码密码的泄露风险说明
哪怕仅在本地设备运行,硬编码MySQL密码也存在明确的泄露风险,常见风险场景包括:
- 脚本文件意外上传至代码仓库、共享文件夹,或误发给他人时,明文密码会直接暴露
- 本地设备被植入恶意程序后,明文存储的密码会被批量扫描窃取
- 后续调试、排错过程中如果不小心打印连接字符串,密码会直接出现在日志或控制台输出中
- 多人共用设备时,其他有权限访问你用户目录的账号可以直接读取脚本内的明文密码
针对mysql.connector的安全改造方案
以下方案均无需在业务脚本中硬编码密码,可直接适配你当前的技术栈:
方案1:通过环境变量存储密码
- 先在本地配置环境变量:Windows可在系统环境变量中新增
MYSQL_PASSWORD,值为你的数据库密码;Linux/macOS可在~/.bashrc或~/.zshrc中添加export MYSQL_PASSWORD="你的数据库密码",配置完成后重启终端生效 - 脚本中读取环境变量生成连接,示例代码:
import os import mysql.connector db_conn = mysql.connector.connect( host="你的数据库地址", user="你的数据库用户名", password=os.getenv("MYSQL_PASSWORD"), database="目标数据库名" )
该方案完全不需要把密码写入脚本文件,即使脚本外泄也不会泄露密码。
方案2:通过独立配置文件存储密码
- 新建
config.ini文件存储数据库配置,一定要将该文件加入.gitignore,永远不要上传到任何公开代码仓库config.ini内容示例:
[mysql] host = 你的数据库地址 user = 你的数据库用户名 password = 你的数据库密码 database = 目标数据库名
- 脚本中读取配置生成连接,示例代码:
import configparser import mysql.connector config = configparser.ConfigParser() config.read("config.ini") db_conn = mysql.connector.connect( host=config["mysql"]["host"], user=config["mysql"]["user"], password=config["mysql"]["password"], database=config["mysql"]["database"] )
- 额外权限配置:Linux/macOS下执行
chmod 600 config.ini,仅允许你的账号读写该配置文件;Windows下可在文件属性中关闭其他用户的访问权限。
额外安全优化建议
- 为该导入任务单独创建权限最小的数据库用户,仅授予目标表的插入权限,不要开放全库读写、删改、修改表结构等多余权限,即使密码泄露损失也可控
- 如果连接的是远程MySQL,建议开启SSL连接,在mysql.connector的连接参数中添加
ssl_ca="/path/to/ca.pem"即可开启,避免数据传输过程中被窃听 - 脚本运行过程中不要打印任何连接参数、密码相关内容,错误捕获逻辑也要避免把连接字符串输出到日志或控制台
内容的提问来源于stack exchange,提问作者Mason Perry
相关产品推荐
相关产品推荐

