在校内和微博都偶然看到了百度搜索“奥运”等关键词,“百度一下”会变成“中国加油”并且按钮变红,但是打上“日本”就会消失的神奇现象;这种陆离的事情,身为伪前端怎么能错过呢~!
我的第一反应便是做很多关键词实验,输入日本会让按钮恢复原状,那输入日呢?单单一个日也让按钮恢复原状,可是单单一个本却没有。其实现在就可以得出结论,触发恢复原状事件的罪魁祸首其实只是“日”字,跟日本没有关系了。可是我们怎能止步于此呢~!
首先来看这个输入关键词就更换搜索按钮样式的CSS实现,在输入关键词后,搜索按钮通过JS自动加上了一个“background-position: 0px -38px;”的样式,也就是说将搜索部分的背景移动了38px实现了搜索按钮由白色到红色的效果,使用了CSS sprites的技术(即:将网页上所有的小图合并到一张大图上,通过读取大图上的不同位置来显示不同的小图片)。
打开按钮的背景图,也可以看到这一点。
接下来就是核心的,实现输入不同关键词来触发CSS改变的逻辑了,看一看JS是如何实现的。
在网页的资源中,很容易的找到了aoyun-1.1.js,接下来就是下载以及格式化。格式化使用了Sublime Text 2的JsFormat插件。
我们可以看到非常多的关键词,并且是以不同的比赛项目等关键词类型被分为了很多组。事实证明这些关键词都可以触发按钮变色的事件。不过这并不是我感兴趣的地方,真正的问题是:为什么输入“日”以后,按钮又会恢复。
在文档的中部,可以看到一个名为r的数组,内容是utf-8的编码,但是并不是通常可以解析的“胡”,而是“\u80e1”的形式。体现了刻意隐藏的居心。r让人联想到了reset,即重置。不管怎么说,我们都可以看看这个背后是什么内容。
把所有的\u替换成;&#x,再把”, “替换成; 我们就得到了一个相对标准的utf-8文本。
接下来,放到网上随意找的utf8在线转换页面中,我们就可以看到其真面目了。
果然,我们得到了一份耀眼的敏感词表,而“日”果然在其中。而输入这份敏感词表中的任何一个关键词,都会触发让按钮颜色恢复的事件。关键词还包括“兴奋剂”等。当然,还有很多喜闻乐见的政治词汇啦。
最后要说的是,本来百度的敏感词系统是比较隐蔽的,很少能通过搜索的办法找到哪些是政治敏感词,而哪些不是。大多数时候百度都是直接过滤搜索结果的。也因此,我还是很不太明白百度这个设定的意义何在,更何况还留下了“输入日本就恢复”这样的话柄。
可以想见,百度一定会在未来几天将“日”从其敏感词表中去掉的。