头像转码接口调用 convert,文件名传 a.jpg;id;.jpg,转码目录里多出一个 id 的输出文件,内容正是当前进程的用户。日志里那行命令被完整执行了两遍。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,命令是用字符串拼好交给 shell 的,分号在 shell 里就是语句分隔符,后面的内容成了新命令。引号没加、参数没做转义、shell=True 三件事凑齐,用户输入就变成了命令的一部分。
「命令注入分号」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
import subprocess subprocess.run(['convert', src, '-resize', '200x200', dst], check=True)
权限不要一口气开到最大,先加到够用再往上试,范围小才好收。
具体做法是,subprocess 传列表参数 去掉 shell=True;文件名先落到临时目录并重命名为固定名字 不带用户输入;确实要拼命令的 用 shlex.quote 包一层;命令执行账户降权 去掉写站点目录的权限。
最后用这个标准收尾,文件名带 ;id 再传一次 返回 400 转码目录里只有一张图 没有多出的输出文件。
