安全 · 进阶
注入:把指令和数据分开
一句话: 每一个把用户字符串拼进命令的地方都是一个洞——而解法是参数化,不是过滤。
唯一的原则
引擎应当分别收到命令和数据。参数化查询、用参数数组传递的系统命令,以及会标记不安全内容的模板引擎。过滤字符串是一场你永远会输的赛跑。
它出现在哪里
数据库、操作系统命令、库的查询、对搜索引擎的调用,还有动态拼出来的地址。以及——是的——也包括给语言模型的提示词,那里外部内容可能被当作指令来解读。
纵深防御
给数据库用户最小权限,这样即便有东西漏过去,损害也是有限的。以及按schema校验输入——不是作为分离的替代,而是作为一层额外的、从一开始就挡住荒谬输入的防线。
深入一层
跑自动化测试,给每个字段喂进异常输入——特殊字符、极端长度、不同编码——并验证响应是一个有序的错误,而不是异常行为。这也会顺带抓到普通的bug,不只是漏洞。