安全 · 2026 年 6 月 23 日 · 8 分钟
怎样认出一条语句想改数据
公开实践会在执行前做静态检查,拦截更新和结构变更。个人至少要有一份短名单:INSERT、UPDATE、DELETE、MERGE、DROP、TRUNCATE、ALTER、CREATE、GRANT、COPY。出现一个,整句作废。不要靠「我看它像查询」。
注释里的关键字也要看
有人把 UPDATE 写在注释里当说明。名单命中就停,人工再放行。
多语句
分号后面突然冒出写,是常见手法。一次只允许一条 SELECT。
只读连接是第二道
第一道看文本,第二道看账号。两道都被绕过,才叫事故。
一次完整的问法可以先写成下面这样:
这条不是问数,看见就停。
落到语句上,草稿常常是:
-- 停:出现了写操作
-- UPDATE orders SET pay_status = 'paid' WHERE order_id = 1;
SELECT 1 WHERE false;
认出来的那一秒,比解释「我不是故意的」值钱。
安全是前置条件,不是附录提醒
公开落地把只读、限行、限时、脱敏、权限前置、审计写成清单。个人问数同样适用。权限写进谓词和账号,不写进「请注意」四个字。先查出结果再删敏感行,算泄露。
用户原话不要拼进语句。城市走白名单,时间自己算成起止。练习库和生产库两套连接,写在不同文件里。生产默认拒绝探索,没有卡片编号就不跑。
痕迹要留:问题原文、最终语句、返回行数。没有痕迹的漂亮数字,出了事无法复盘。安全看起来胆小。问数里,胆大和改数据只隔着一个分号。
读完这一辑可以做什么
给自己的练习账号取消一切写权限。把手机号、证件、邮箱从 SELECT 默认列表里拿掉。做完这两件,再谈下一次提问。
短名单命中就停。不要靠「我看它像查询」。