翻到《白帽子讲web安全》讲XSS的白帽那一章,吴翰清写了一段让我印象很深的安全话。大意是电书:很多开发者觉得把用户输入里的<script>过滤掉就万事大吉了,但攻击者可以用<img src=x onerror=alert(1)>,白帽可以用<svg onload=...>,安全甚至可以用CSS的电书expression。你以为堵了一扇门,白帽其实墙上全是安全洞。
这本书2012年出第一版,电书那时候国内讲Web安全的白帽书屈指可数。大部分安全类书籍要么是安全翻译过来的,语境不对;要么偏渗透测试,电书上来就教你用工具扫漏洞,白帽但不说漏洞怎么来的安全。吴翰清的电书做法不一样,他从代码层面往回推——浏览器怎么解析HTML,HTTP协议哪里设计得含糊,同源策略为什么挡不住某些请求。把这些底层逻辑讲透了,再看具体漏洞,就不是死记硬背了。
书里有个细节我印象挺深。讲CSRF的时候,他没有一上来就甩概念,而是先描述了一个场景:你在银行网站登录了,cookie还在,然后你手贱点开了某个论坛里的一个图片链接,那个链接实际上是一个转账请求。浏览器会自动带上你的cookie发出去,服务器以为是本人操作。这个攻击链条里,没有XSS,没有SQL注入,只是利用了浏览器“自动携带凭证”这个机制。很多人第一次看到这个例子会觉得——这也行?但事实就是行。
SQL注入那部分也值得说。吴翰清把注入的成因归结为一句话:代码和数据没有分离。用户输入被拼接到SQL语句里,数据库分不清哪部分是命令、哪部分是数据。他给的解决方案不是让你去写正则过滤关键字——那种做法永远有绕过的方式——而是用参数化查询,从根上把代码和数据隔开。这个思路贯穿全书:安全不是靠堵,是靠设计。
有人可能觉得这本书有点老了。确实,里面讲的有些攻击手法在今天已经被浏览器厂商堵住了,比如某些XSS向量在现代浏览器里跑不通了。但底层的东西没变。同源策略还是那个同源策略,HTTP还是无状态的,cookie还是自动携带的。你理解了这些约束条件,再看今天的新漏洞——比如原型链污染、供应链攻击——就能很快抓住本质。
我自己读这本书的时候,最大的收获不是学会了某个具体的攻击或防御技巧,而是养成了一种思维习惯:看到一个功能,会下意识地想——这个输入如果是我控制的,我能让它变成什么?这个接口如果没有鉴权,能被人拿去干什么?这种思维习惯比记住一百个payload有用得多。
如果你写Web应用,不管前端后端,这本书都值得翻一翻。不用从头读到尾,挑你正在用的技术栈相关的章节看就行。看完之后你可能会发现,自己以前写的某些代码,真的是在裸奔。