XSS、CSRF 到底有啥区别?

1 人参与

经常听人把 XSS 和 CSRF 挂在嘴边,甚至面试时也爱考,但很多人聊着聊着就把自己绕进去了,感觉这俩货都是搞浏览器的,听着都挺吓人,到底哪儿不一样?其实这俩虽然都姓“跨”,但脾气秉性完全不同,真要分清楚,还得从它们“想干啥”和“怎么干”说起。

一个是“信了谣言”,一个是“被人当枪使”

咱们先说 XSS(跨站脚本攻击)。这玩意儿用大白话讲,就是浏览器太实诚,信了不该信的内容。攻击者想方设法把一段恶意脚本(你可以理解成一段坏代码)塞到了网页里,当你打开这个页面时,浏览器以为这是网站自己的代码,二话不说就执行了。这就好比你收到一封看起来是银行寄来的信,结果信封里夹着个微型窃听器,你拆开信封(打开网页),窃听器就开始工作,卡号密码全被偷走。

而 CSRF(跨站请求伪造)完全是另一副嘴脸。它不是偷你的东西,而是利用你的身份去干坏事。这时候浏览器不是“信了谣言”,而是“被人当枪使”。攻击者并不需要偷你的密码,他只需要诱导你点击一个链接或者打开一个图片,浏览器就会背着你自己偷偷给网站发个请求。比如你刚登录过银行网站,还没退出,这时候你手滑点了个“领红包”的链接,结果这个链接其实是“给黑客转账”的指令。银行那边一看,哟,这请求带着正确的 Cookie 呢,是本人操作,转账成功!这就是 CSRF 的阴险之处。

拿钥匙和借刀杀人

为了更直观地理解,咱们可以打个生活化的比方。

XSS 就像是个技术高超的小偷。他趁你不注意,配了你家的钥匙(窃取 Cookie),或者干脆在你家窗户上挖了个洞。无论你在不在家,他都能进屋把东西搬空。因为他在你家里装了监控,你的一举一动都在他眼皮子底下,甚至你输入保险柜密码的时候,他都在旁边看着。

CSRF 则更像是借刀杀人。攻击者进不去你家门,也偷不到钥匙。但他知道你是个热心肠,而且刚从银行取完钱出来(处于登录状态)。他伪装成乞丐或者老熟人,跟你说:“哥们,帮我把这个包裹送到那个地址去。”你以为只是帮个忙,结果那个包裹里装的是炸弹,送到的地址是警察局。在这个过程中,你是自愿(被诱导)去做这件事的,你的身份(钥匙)也是真的,但结果却是帮别人干了坏事。

防御思路:各打五十大板

既然原理不一样,那防起来的路数自然也不同。

防 XSS,核心就两个字:过滤。既然浏览器容易信错人,那咱们就得帮它长个心眼。所有用户输入的内容,不管是评论还是搜索词,都得像过安检一样严格检查,把里面的危险代码剔除或者转义。就像信件分拣员,看到信封里有硬邦邦的疑似窃听器的东西,直接没收或者把信封封死,让里面的东西跑不出来。

防 CSRF,核心在于验证身份。既然攻击者能借用你的名义发请求,那网站就得学会辨别这个请求是不是你“真心”想发的。这就有了 CSRF Token,相当于网站给你发了一个一次性口令,每次提交表单都得带上这个口令,攻击者猜不到这个口令,自然就没法伪造请求了。另外,现在很多网站转账时还要输验证码或者输支付密码,这就是典型的“二次确认”,即便你拿着枪(Cookie),扣扳机前也得再确认一下是不是真要开枪。

所以说,别看这俩漏洞名字都挺洋气,本质上就是一个“偷信息”和一个“骗操作”。下次再有人把这俩混为一谈,你就告诉他:一个是家里进了贼,一个是出门被人当成了冤大头,这能一样吗?

参与讨论

1 条评论
  • 微笑僵硬者

    感觉浏览器太老实了,信啥都执行。

    回复