经全量扫描确认,仓库内不含:API 密钥、服务地址(endpoint)、Bearer 令牌、 邮箱、手机号、身份证号、IP 地址、本机文件路径、任何个人或单位账号信息。
config/settings.yaml 不在仓库中,只提供不含真实值的模板
config/settings.example.yaml。
优先用环境变量,其次用本地 config/settings.yaml(已被 .gitignore 排除)。
core/config.py 是唯一的凭据入口,它在真正发起请求的时刻才读取配置;
未配置时模块照常导入,只有实际调用外部服务的函数才会抛 MissingCredential。
异常信息中只出现变量名,不回显取到的值。此外,所有对外请求的失败路径都做了
服务地址剥离:requests 与 urllib 的原生异常文本会带上完整请求 URL(其中
含主机名、有时还含查询串里的 key),若被界面层直接渲染就等于把服务地址暴露给
终端用户。因此 modules/tool_dispatcher.py、modules/vision_analyzer.py、
modules/llm_planner.py、modules/llm_responses.py 一律只向上层报出异常类型与
HTTP 状态码,详细排错请查服务端日志。
# 1. 确认没有密钥形态的字符串
grep -rInE "(sk|cpl|hf|ghp|AKIA|AIza)[-_A-Za-z0-9]{16,}" .
# 2. 确认没有写死的服务地址(正常应只剩文档中的示例链接)
grep -rIno "https\?://[^\"' ,)]*" . | sort -u
# 3. 确认本地配置没有被跟踪
git status --porcelain --ignored | grep settings.yaml务必新建一个空仓库来发布,不要沿用旧仓库的提交历史。 密钥即使从当前文件中 删除,只要曾经提交过,就仍然留在历史对象里,可以被任何人检出。
照片可能携带 GPS 等 EXIF 信息。.gitignore 已排除 *.jpg / *.jpeg / *.webp;
运行时上传的图像只写入系统临时目录,不进入仓库。
assets/ 下的界面截图已确认不含 PNG 元数据块,其中的地块名称、面积、
土壤指标与经纬度均为演示用示例值。
先到服务商控制台吊销并重新签发,再处理代码——只删代码不吊销是无效的。