如何在Google Apps Script中安全使用敏感凭证?
Google Apps Script 敏感凭证存储规范及认知误区说明
通用存储规范
针对外部API密钥、数据库密码、鉴权令牌等敏感凭证,统一遵循以下规则:
- 优先使用
Properties Service(属性服务)存储,禁止直接在代码中写入明文凭证 - 根据使用范围选择对应存储分类,严格遵循最小权限原则:
- 仅允许脚本所属个人使用的凭证,存储到
UserProperties - 所有访问该脚本的用户共用的凭证,存储到
ScriptProperties - 仅当前绑定的文档/表格专属的凭证,存储到
DocumentProperties
- 仅允许脚本所属个人使用的凭证,存储到
- 首次写入凭证时,建议通过单次执行的临时代码写入后删除对应代码段,或通过自定义输入框提交凭证,避免配置阶段明文残留在脚本中
- 导出/共享脚本代码时,无需额外手动删除敏感信息,属性服务存储的内容不会随代码一同导出
「属性服务和硬编码没有区别」的认知错在哪里?
你产生该误解的核心原因是混淆了「脚本代码存储区」和「独立加密存储区」的本质差异,两者的安全等级完全不同:
- 硬编码的凭证是明文写在
.gs脚本文件中的,所有拥有脚本编辑权限的用户打开代码就能直接看到完整凭证;如果后续你共享脚本协编辑、上传代码到代码仓库、导出代码备份,凭证都会同步泄露 - 属性服务是和脚本代码完全隔离的Google官方加密存储区:
- 即便是拥有脚本编辑权限的用户,也无法直接查看属性存储的内容,只有主动调用
getProperty()方法打印才会暴露,你可以通过权限管控禁止无关人员执行调试类代码 - 导出脚本代码、复制绑定的表格/文档文件时,属性服务中的内容不会被同步导出/复制,从根源上避免了代码流转过程中的凭证泄露
- 存储的内容默认做静态加密,防护等级远高于明文写在代码里的信息
- 即便是拥有脚本编辑权限的用户,也无法直接查看属性存储的内容,只有主动调用
正确使用示例
首次写入凭证(执行后删除该段代码)
function setSecretOnce() { const scriptProps = PropertiesService.getScriptProperties(); // 写入你的实际API密钥,执行完这段代码后直接删除该函数即可 scriptProps.setProperty('EXTERNAL_API_KEY', '你实际的接口密钥'); }
业务逻辑中调用凭证
function requestApiData() { const scriptProps = PropertiesService.getScriptProperties(); const apiKey = scriptProps.getProperty('EXTERNAL_API_KEY'); // 后续发起请求的逻辑,全程不会在代码中出现明文密钥 const res = UrlFetchApp.fetch(`https://api.example.com/getInfo?key=${apiKey}`); }
内容的提问来源于stack exchange,提问作者ja_him
相关产品推荐
相关产品推荐

