入门

第 10

敏感数据、会话与信任:不是每个值都应该进入脚本

当所有“有用的值”都被当作无害文本时,自动化会变危险。密码、私钥、Cookie 和身份验证状态的生命周期应该与路径、图片尺寸或表名不同。

自动化之前,先判断这个值属于哪一类

路径、归档名或图片宽度属于普通配置。密码、私钥、会话令牌或数据库凭据可能直接授予访问权。把两种值都写进同一个可复用脚本,脚本本身就会变成敏感信息。

保存一个值之前问两个问题:它能否授权某件事?我是否愿意把这个文件复制到另一个项目,或拿给别人审查?如果答案是否定的,就不要把敏感信息写进流程。

检查环境很有用,但环境本身不是保险库

env 会主动遮罩名称看起来敏感的值。这只是展示层的安全措施,并不能证明每个环境变量都安全,也不能证明敏感信息不会藏在意外的变量名下。

只检查真正需要的命名空间或值。避免传播完整环境转储的截图或导出,也不要因为终端里看到的是已遮罩值,就认为底层服务器配置可以公开。

env
env server
env request

会话和 Cookie 是应用状态,不是随手记事本

ses 展示层级化的 PHP 会话数据,coo 则把可见 Cookie 放在独立区域中处理。受保护的身份验证状态和会话 Cookie 不允许通过普通导出或覆盖操作修改。

这条边界很重要,因为会话数据可能承载身份、授权和临时应用状态。缩小检查范围,只修改自己控制的命名空间,不要把会话存储当作长期敏感信息的便利藏身处。

ses -l
coo
coo -a

哈希可以证明一致性,但不能隐藏原始数据

hash 计算摘要和 HMAC。摘要很适合回答“这些字节变过吗?”,也适合记录归档或发布产物的身份。

哈希不是加密。如果原始值来自一个很小、容易猜的集合,哈希并不会让它保密。真实性依赖密钥时用 HMAC;内容本身必须不可读时使用加密。

hash -s "hello terminal"
hash

只有 key 也被保护时,加密才能保护内容

enc 使用认证加密算法、隐藏的密码提示和精确密钥模式。先用 enc 查看服务器支持什么;默认密码提示不会把密码写入可见命令历史。

加密文件如果和暴露的密钥放在一起,保护价值会大幅下降。尽可能把密钥与加密数据放在不同的信任边界,提前理解恢复流程,并在删除明文源之前测试解密。

enc

文件系统权限可以减少访问,但不能替代密码学

0600 这样的权限模式表示普通情况下只有当前文件所有者应该能读写。主机遵守 UNIX 权限模式时,它适合本地密钥文件和私有导出。

权限无法防住托管账户所有者、备份或被攻陷的 PHP 进程。执行 mod 后用 stat 验证真正发生了什么,并把权限与正确的存储和加密模型组合使用。

cd lil-playground
md trust
echo "example private note" > trust/note.txt -r
mod trust/note.txt -0600
stat trust/note.txt
hash trust/note.txt

分清清理、卸载和销毁

clear 只清除可见终端记录。uninstall <module> 删除一个扩展模块。kill -include 删除可选界面层,kill -install 删除扩展层,而不带参数的 kill 是完全移除终端的边界。

这些动作不能在肌肉记忆里混成一件事。任何破坏性操作之前,先说清楚要删除哪一层、哪些文件应该保留。安全的终端使用者应该在执行前就能解释回滚方案。

清理显示clear只清除终端记录;文件和模块保留
删除模块uninstall <module>一个扩展模块;遵循依赖规则
重置界面kill -include持久/会话 CSS 与 JavaScript 层
重置扩展kill -install已安装扩展层;Core 保留
完全移除killlil-terminal 本身

把它保存成脚本

把它保存为 trust-checkpoint.lil。它只创建示例数据,设置严格的文件权限模式,记录元数据并保存摘要。注意它刻意不自动化的内容:密码输入和解密密钥留在脚本之外。

#lil
@install md echo mod stat hash
cd lil-playground
md trust
echo "example private note" > trust/note.txt -r
mod trust/note.txt -0600
stat trust/note.txt
hash trust/note.txt > trust/note.sha256 -r
stat trust/note.sha256