模型给工具一个文件名,怎样确保它作为参数传入而不是被 shell 解释
模型给出文件名以后,不要把它拼到一整段 shell 命令里。空格、引号和分号本来可以只是数据,一旦进入命令文本,就可能改变解释方式。客户端应固定可执行程序与操作,只允许模型提供经过验证的参数值。
参数数组表达边界
本文固定执行当前 Python 解释器,启动一个只回显参数的短程序,使用 subprocess.run 的参数数组和 shell=False。测试值包括普通名字、带空格的名字、带双引号的文字和含分号的文字。每次只提供一个数据参数,子进程必须收到一个完全相同的字符串。
这里分号只是合成文本,不包含真实破坏命令,也不访问文件系统。检查器核对子进程返回的 JSON 数组和父进程输入,既检查元素数量,也检查每个码点。只看进程退出码零无法知道参数是否被拆分,回显内容才是这次实验的直接证据。
不让模型决定执行器
失败反例是把模型值拼在 echo 后面交给 shell。即使普通文件名看起来正常,特殊字符也会经过额外语法解释。另一个反例是数组形式但让模型指定数组第一个元素,这仍把选择执行程序的权力交了出去。程序路径、固定选项和允许操作都应来自应用注册表。
参数边界正确不代表参数语义安全。像以减号开头的名字可能被目标工具解释成选项,目录跳转也可能仍然越界。目标程序支持时可使用明确的选项终止符,同时按允许路径、扩展名与权限做检查;不能把一项技巧称为完整防线。
Windows 场景要看真实目标类型
Python subprocess 文档对 Windows 批处理文件有专门提醒:即使不显式启动 shell,系统也可能按命令解释规则处理批处理目标。因此本文演示固定为 Python 可执行文件,不把 .bat 或 .cmd 当作同一验证范围。真实项目依赖批处理时,需要按官方说明与目标程序行为单独验证。
日志展示也应保留数组结构,不把它格式化为看起来可复制的一整行后重新执行。人类可读的引号并不保证适合另一种 shell。复查时同时保存固定程序身份、参数列表、退出码和输出摘要,避免以后换了执行器还误用旧结论。
本文没有执行模型提供的程序,也没有调用真实工具 API。检查通过只说明这些无害字符串在当前解释器调用中按单个参数传递。权限控制、提示注入防护和文件内容审查仍是独立问题,运行器不能因为模型参数已通过 Schema 就跳过这些边界。
配套文件与依据
本文的合成输入和参考结果可下载独立样本 a027.json,离线检查器 a027.py与样本放在同一目录后运行。检查器不调用模型接口。 使用 Python 3.12 或兼容版本,将上述文件下载到同一目录,执行 python a027.py。
留言讨论
评论发布后会被人工复核,违规内容将被删除。
如果发表没有反应,可以前往联系我们告诉我们。