安全 · 进阶

注入:把指令和数据分开

一句话: 每一个把用户字符串拼进命令的地方都是一个洞——而解法是参数化,不是过滤。

唯一的原则

引擎应当分别收到命令和数据。参数化查询、用参数数组传递的系统命令,以及会标记不安全内容的模板引擎。过滤字符串是一场你永远会输的赛跑。

它出现在哪里

数据库、操作系统命令、库的查询、对搜索引擎的调用,还有动态拼出来的地址。以及——是的——也包括给语言模型的提示词,那里外部内容可能被当作指令来解读。

纵深防御

给数据库用户最小权限,这样即便有东西漏过去,损害也是有限的。以及按schema校验输入——不是作为分离的替代,而是作为一层额外的、从一开始就挡住荒谬输入的防线。

深入一层

跑自动化测试,给每个字段喂进异常输入——特殊字符、极端长度、不同编码——并验证响应是一个有序的错误,而不是异常行为。这也会顺带抓到普通的bug,不只是漏洞。