先来看一个有趣的案例——当你访问 https://bookman.sinaapp.com/doover.php 这个页面时,它会自动发送一条状态:“已经结束了,这是我的自白,想明白原理的看我日志就好。https://bookman.sinaapp.com/doover.php”。表面上看像是某人的真情告白,实际上背后隐藏着一个经典的跨站请求伪造(CSRF)漏洞。
顺着链接的源码深入挖掘,发现它利用了人人网的一个接口:https://j.renren.com/publisher/status。这个接口本质上是一个 POST 请求,只需向 content 参数中填入一段文本,就能直接发布状态。页面中藏着一个自动提交的表单,直接将那段“自白”内容发送出去。整个流程没有任何额外的验证,就这样简单粗暴地完成了状态发布。
具体来看这段 HTML 代码。一个宽度为 0 的 iframe 作为目标容器,一个隐藏的 form 通过 POST 方式向人人网接口提交数据,表单中的 synsbcp 字段固定为 1,content 字段就是那段状态文本。页面加载后,脚本自动执行 document.akiko.submit(),用户完全察觉不到任何操作,状态就已经成功发出去了。

修复方案
说实话,这种 CSRF 漏洞修复起来并不复杂,核心思路就是引入 token 验证机制。在每次请求敏感操作(如发布状态、修改个人资料)时,服务器端必须校验一个与用户会话绑定的随机 token,并且这个 token 不能通过简单的 GET 或 POST 参数被第三方窃取。这样一来,即便攻击者伪造了请求,也无法获取合法的 token,漏洞自然就被有效堵住了。
类似的安全问题以前也出现过,例如由 Flash 引发的 CSRF 漏洞,当时是通过站内信传播的,攻击手法如出一辙。说到底,这属于典型的低级错误——对关键接口缺少最基本的防跨站请求伪造保护。从安全设计角度出发,任何会改变用户数据或状态的接口,都必须引入不可预测的验证机制。Token 是最简单直接的一招,但也是很多开发者容易忽略的关键环节。
