今天是万圣夜(Halloween),正好也是社团文化节晚会。
大家肯定都知道,其实我们是不太关心节目的,而且协会缺少妹子,演不出什么好节目,所以我们临时决定,在晚会上搞了一个“不给糖就捣蛋”(Trick-or-theat)的活动。
今天不是万圣节
稍微纠正一下,10月31日并不是万圣节(All Saints’ Day),而是万圣夜(Halloween)。就像12月24日不是圣诞节(Christmas Day)而是圣诞夜(Christmas Eve)……其实都是淘宝搞促销的借口而已
这就是晚会现场,虽然我们没有人上台演出。
Trick-or-treat!
我们协会并没有上台演出(因为需要提前排练),而是在舞台两边的微信墙演出——就是拿微信关注“社团石大”公众号,然后在活动期间给公众号发文字,你的文字就能显示到微信墙上,从而参与互动。就是下图——
那个大法风格文字不是我们的节目。
节目开始——我们的演员,向微信墙,发了一条信息:
节目很短,一下子就演完了。
由于我们的准备不太充分,所以节目真的不精彩。下回我们会好好准备……
严肃点
这也叫节目?
难道你没仔细看一下演员到底发了什么吗?我们的演员反映说,大屏幕黑了3分钟,投影仪(其实应该是操作投影仪的人)一直在重启,最后重新打开网页才上去……
发生了什么
微信墙
我们的节目虽然很短,但是有一个响亮的名字——XSS(跨站脚本攻击)。
首先谈谈微信墙。
微信实在是火得不得了,各种营销互动拉票集赞骗人活动都用微信,简直是腾讯的新帝国!因为微信提供了众多开发者接口(虽然不一定都给屌丝开放),但是在大家都不愿意安装新 APP 的情况下,使用微信作为一个轻 APP 实在是太划算了。
微信墙的原理就很简单了——一个经过设计狮精心制作的网页,后台 PHP+MySQL,隔几秒钟就把服务器里的留言显示出来(用 AJAX 技术避免浏览器的“刷新”)。至于微信墙做得怎么样,基本上取决于设计狮的水平。后端PHP+前端AJAX都普及到泛滥了,所以随便找个人都能把后台写出来。服务器的数据哪儿来呢?因为微信有接口,所以按照疼讯的接口文档编程就行了。
因为微信太火了,所以事实上根本都用不着编程——百度上一搜一大把。稍微懂点技术就行,如果拿 Windows 当服务器,甚至都不用敲命令。
XSS
接着谈谈我们的“节目”。
XSS 有很多种形式。精心构造的 XSS 可以达到破坏或窃取数据的目的。当然,作为一个晚会的“节目”,我们就只写了一个最简单的 while(1)。(其实演员还不知道这个东西是啥呢!)
因为微信墙后台太简单了,而且没有哪个正常人会像孙悟空那样大闹天宫晚会(特意安排的不算),所以编程的人肯定没想到有人会在万圣节前夜捣蛋——
微信是疼讯搞的,我们认为它没有漏洞(至少跟微信墙相比)。它会把我们发的内容原封不动地交给微信墙服务器。作为一个网站,微信墙可能会用以下方式显示观众留言:
他们很可能直接用 echo 语句把观众留言输出。
PHP 的 echo 并不进行任何过滤,所以你发萌萌哒
的时候会显示萌萌哒
三个字;发萌萌哒<script>while(1);</script>
的时候也会把这堆乱七八糟的东西同时输出,只不过,后面script
包围的东西是一个合法的 HTML 标签,所以浏览器会执行这段代码。于是……浏览器卡死了。
XSS 就是这样。一个攻击者试图找到网站的漏洞,通过发送精心构造的数据,使浏览器可以执行一段代码。结果就是,其他人在浏览这些页面的时候,浏览器执行了这段代码,……实施破坏,或者窃取隐私,或者植入病毒
XSS 的防范也是个技术活。原则很简单,不要信任任何来自用户的数据,因此在输出之前对特殊字符进行过滤是最有效的方法。
高级主题
如果出于功能需要,不能过滤所有 HTML 标签,可以看一下百度Web前端开发部的相关文章。他们试图站在前端的角度,在不过滤 HTML 标签的情况下阻止恶意元素的产生。
另一个 Trick-or-theat
既然一个简单的脚本就把微信墙搞垮了,那么他们微信墙后台的密码肯定是' or 'a'='a
。不信可以试试。
这是我们要演的另一个节目,节目的名字是 SQL 注入,只不过今天太匆忙没做彩排。等以后再有晚会的时候,我们可能就会派人演出,到时候欢迎大家捧场。
结论
现在处处都在强调“安全生产”,甚至有一个工地里面都写着亲爱的工友们:在外打工,注意安全,一旦发生事故:别人睡你媳妇,打你孩子,花你的抚恤金!打工安全,为你自己。
所以,作为给人打工的IT农民工——码农,开发应用的时候怎能不注意安全呢?虽然很多码农没有媳妇孩子和抚恤金