首页 / 科技 / 正文

你随手点开的那个弹窗,怎么就把账号“送”出去了?聊聊跨站脚本

前几天我表妹给我发微信,说她的某书账号半夜给几十个陌生人发了私信,内容全是推广减肥药的链接。她吓坏了,以为自己中了什么木马。我让她回忆前一天干了啥——她说就逛了一个分享穿搭的论坛,点开了一个“免费领穿搭模板”的帖子。

又是这个。

不是她手机中毒,也不是账号被盗。大概率,她是被卷进了一场跨站脚本的小型事故里。听起来挺技术的一个词,说白了,就是别人在网页里塞了一段代码,你打开这个页面,这段代码就在你的浏览器里跑起来了——用它自己的话讲,叫“借你的手,干我的事”。

一个页面里,到底藏着几拨人?

咱们先想个最常见的东西:网页评论区。

你打开一篇文章,底下有个框让所有人留言。你写下“写得真好”,点击发送,服务器把这条留言存下来,其他读者刷新页面就能看到。

网站评论区留言框 输入状态

问题就出在这儿。如果这个网站憨厚老实,你输入什么它就原样显示什么,那还算安全。但如果有人输入的压根不是文字,而是一段脚本呢?

比如他在留言框里敲进去的不是“写得真好”,而是一串能读取你浏览器里登录状态的代码。服务器照样把它存下来,你打开这个页面,浏览器也照样把它当成网页正文的一部分执行了。它悄悄拿着你在这个网站上的登录凭证,以你的身份去发消息、去点赞、去关注。

我表妹的情况,差不多就是这么个路子。那个“免费领模板”的帖子,正文或者评论区里被埋了料,专门盯着登录状态下手。整个过程可能连一秒都不到,你甚至没看到有东西加载。

说白了,跨站脚本不是一种病毒,它是一种信任错位。网站信任了你输入的东西,你的浏览器信任了这个网站,最后你躺枪。

你输入的不是“文字”,是“指令”

这里最容易让人迷糊的地方是:我明明打的字,怎么就成了代码?

我经常拿自动售货机打比方。你投币、按键、它出货,这是正常流程。跨站脚本相当于什么呢——你在选货键盘上输入了一串神秘代码,本来应该只是记录你要买什么口味薯片的机器,结果把它解读成了“打开出货口,把所有商品都吐出来”。

机器错了吗?机器按指令办事。是输入的人,利用了机器不设防的解读规则。

自动售货机按键面板 特写
自动售货机按键面板 特写

网页也一样。当你在评论区里输入一段看起来像标签的文字,比如一对尖括号包着的字母,很多服务器的第一反应不是“这用户怎么打了一串怪东西”,而是“哦,这是网页代码的一部分,我得把它渲染出来”。

于是你的浏览器就认认真真执行了。它认识这对尖括号,它知道这是代码段。然后,代码就跑起来了。

这就是跨站脚本最原始的样子,也是最容易理解的一种:存储型。你把代码“存”在了服务器上,所有来看这条内容的人都会中招。像什么?像你在小区公告栏贴了张看起来正常的通知,但通知背面涂了胶水,谁碰谁粘手。

还有两种变体,一种是把代码塞在网址参数里,点一下链接就触发,叫反射型;另一种更隐蔽,压根不经过服务器,直接通过浏览器的页面操作来执行,叫DOM型。名字听着绕口,本质都一样:想办法让不该跑的代码跑起来。

“我不乱点链接,就没事了吧?”

“我不乱点链接,就没事了吧?”
“我不乱点链接,就没事了吧?”

不一定。

很多人的安全习惯是这样的:不明链接不点,陌生文件不下载,弹窗广告一律叉掉。这套习惯挡得住大部分钓鱼,但对跨站脚本来说,有时候你根本不需要“乱点”。

你正常打开一个你信任的网站,正常浏览,正常登录。这个网站某个角落,比如商品评价、用户昵称、帖子标题,被人埋了料。你打开页面的一瞬间,脚本就开始跑了。你的操作完全正常,你的习惯完全良好,但你还是中招了。

所以跨站脚本这个事儿,主要责任在网站,不在用户。用户能做的不多,能做的也不少——待会儿说。

还有一个特别常见的误区:很多人觉得“我账号里又没钱,偷我有什么用”。说实在的,现在一个能正常登录的账号,本身就是一种资产。能发广告、能刷好评、能骗你的好友、能拿去打包卖给黑产。我表妹那个账号被拿去发了那么多条私信,就是这个逻辑。

还有更糟的。如果你的登录凭证被脚本拿走了,对方不仅能操作这个网站,如果这个网站支持第三方登录,而你又授权了其他服务……好吧,这就扯远了。反正记住一点:账号不等于钱包,但账号能通向很多东西。

普通用户和写代码的人,各自能做什么

普通用户和写代码的人,各自能做什么
普通用户和写代码的人,各自能做什么

我不是安全专家,也不想吓唬谁。但既然聊到这儿了,说点实在的。

对普通用户来说,最有用的一招是:给重要账号开二次验证。哪怕登录状态被脚本偷走了,对方想在新设备上登录,还得过短信或者验证器那一关。这就像你家门锁被复制了钥匙,但小区大门还杵着个保安。

另外,不要在多个网站用同一个密码。一个被撞库,全线崩盘。我知道很多人嫌麻烦,我也嫌。但这事儿跟出门带钥匙一样,麻烦归麻烦,不带就是不行。

还有一点,如果你发现自己某个账号莫名其妙发了奇怪的内容,第一时间改密码、踢掉所有登录设备、检查授权应用。别光删内容,要断根。

那写代码的人呢?

说实话,跨站脚本这个漏洞,技术上已经很老了。防住它也不算难。核心就一句话:永远不要信任用户输入,该转义就转义,该过滤就过滤。把尖括号转成安全字符,把不该执行的东西变成纯文本。听起来像废话,但很多网站就是栽在“忘了处理某个输入框”上面。

我见过一个开发者的排查经历。一个页面总是弹出奇怪的窗口,查了半天,发现是用户头像的图片文件名没做处理。有人把文件名改成了代码,服务器返回这个文件名的时候,浏览器就执行了。就一个小口子,足够捅出大动静。

这事儿给我的感觉是,做网站跟家里装修一样。不是说你装了个好门就万事大吉了,窗户、阳台、通风口,哪一处没封好,都可能进东西。你不可能只防大门。

最后说个小心得

最后说个小心得
最后说个小心得

跨站脚本这个话题,网上有很多专业文章,各种分类、各种案例、各种代码演示。我写这篇,不是要教谁黑谁,也不是要劝谁转行做安全。就是觉得,作为一个天天上网的人,了解这么个东西的存在,没坏处。

就像你不需要会修车,但知道仪表盘上哪个灯亮了该去修理厂,就行了。

下次你在某个网站上看到一段莫名其妙的奇怪符号,或者突然弹出个不认识的窗口,或者你的账号自己动了起来——别慌,先改密码,再退出登录。能做的就这么多。剩下的,交给网站去改。

它们不改,你就换个地方玩。这年头,账号比我们想象中值钱,也比我们想象中脆弱。