Hacking with JavaScript――在浏览器之内,网页之外,运行JavaScript(一)

2014-11-24 03:00:26 · 作者: · 浏览: 5

引言

端口扫描、内存溢出、安全漏洞……这些大概是很多人提到黑客时会想到的。他们用的语言自然也是汇编、C这些贴近底层的高级语言。java script似乎与这一切毫不相关,自诞生起相当长一段时间内,这门在浏览器内执行一些简单的校验和互动的脚本语言,是职业程序员看不上眼的玩具。然而,本文就是要谈谈Hacking with java script――以java script来“黑客”。

这之所以能成为一个题目,有两方面的原因。

一:今非昔比,随着web技术大行其道,java script作为web应用前端的实际标准,也成为最热门的编程语言之一。在此过程中,不仅java script原来的优点被人们认识到,它自身也在不断演化以适应更复杂和可靠的编程需求。

二:也是更重要的是对Hacking的理解。正如GNU项目发起人、自由软件基金会创始人RichardStallman所说,“Hacking――‘黑客行为’范围很广,从编写软件、恶作剧到探索MIT校园的地道,在MIT的大穹顶上放个好玩的东西……”可以看出这些行为有几个共同点,那就是创造性、有趣、经常带有冒险性(不一定是身体上的冒险)、行为本人往往不是为了实用,而是为了玩、显示自己的聪明或者探索未知【注1】,还有一点就是与数学家和理论物理学家这样的理论工作不同,都与实际世界有更紧密的联系。而媒体上对黑客的理解只是因为他们和所做的事的一小部分,即对计算机系统安全的破坏。

对本文题目的正当性做了辩护之后,很多行为都能被纳入Hacking with java script的范畴,本文不准备讨论那些绕过java script缺陷和安全上限制的tweaking,而是从运行环境的角度,简单介绍几种不同于通常网页的浏览器中运行java script 的“后门”,看看这些“不走寻常路”的脚本【注2】。

地址栏

在web编程领域摸爬滚打时间久的老同志一定还记得,回到IE一统江湖的时代,在浏览器里调试java script的工具十分有限,除了使用起来不够方便、应用也不广泛的微软的独立的脚本调试器,程序员往往就是在浏览器里裸战,或者用alert方法弹出信息,或者就是利用地址栏。将以java script:开头的一行代码输入地址栏,回车,浏览器就会执行该代码,而且能访问到当前页面的环境,例如文档对象和页面中脚本的各种变量、函数【注3】。比如java script:alert(status)就会弹出在当前页面的脚本中定义的一个status的全局变量。这样做有时候比在代码里插入调试代码更直接方便,不过也仅仅用于临时性地排除一些错误。

比起用于调试,更重要的是事情本身――地址栏里不仅可以输入地址,浏览器会执行其中的java script,这就相当于一个原始的java script控制台。Bookmarklet正是利用了这一点。

所谓Bookmarklet,顾名思义,就像applet、servlet一样,指的是“书签小程序”。也就是在通常保存地址的书签里写入java script,以完成某个功能【注4】。Google的给其网络书签添加新页面的“书签小程序”就是一个很好的例子,将该链接拖动到书签栏,以后浏览某网页时,只要点击该书签,就会弹出一个页面,页面上的表单包含了添加当前页面做书签的各项信息,地址和标题都已经预填了,用户还可以增加标签等信息,提交后这个页面就被添加到用户的Google网络书签里。

我们可以做一些有趣的书签小程序。现在很多人访问诸如新闻、购物网站的目录和列表页时都习惯在浏览器的新标签页里打开链接,但是有些网站,特别是很多国外的大网站(如经济学人、读卖新闻、Amazon等)仍然沿用在当前页面打开链接的传统,虽然我们可以按着Ctrl键或用链接上快捷菜单里的命令在新标签页里打开,但每次这样做稍显麻烦。当然我们也可以修改浏览器的标签页属性甚至像在Firefox里安装一些插件来强制所有链接都在新标签页里打开,但那样未免矫枉过正,在某些场合仍然是在当前页面打开链接方便。最可取的方法自然是需要时指定当前页面的链接都在新标签页里打开,书签小程序正适合完成这个工作。

新建一个书签,命名为“在新标签页里打开链接”,然后将如下代码粘贴到地址里:

java script:(function(){function%20main(cw){for(var%20i=0;i

保存后,每次需要时,先点一下这个书签即可。

因为书签小程序里的代码是保存在地址栏里,为了紧凑,所有不必要的空白字符都省去了,必要的空格则按照URL在规范转码为%20(这一点添加书签时,有些浏览器如Firefox会自动进行)。

压缩前的代码如下,本身十分简单,无需说明。

(function(){
	function main(cw){
		for (var i=0; i
  
   

再比如我若干年前经常在天涯论坛上看到有人刷屏挖坑,盼着分页。错过了首页的沙发板凳地板没关系,还有第二次第三次机会。可惜天涯不是按照贴子屏幕上的高度来分页的,所以再大的坑除了让大家多滚动几次屏幕外没有什么建设性作用。实际上这看似神秘的分页是由每页的楼层也就是回覆贴数量决定的,每页的楼层数量都很接近100【注5】,于是我写了一个“天涯分页”的书签小程序,在天涯帖子上使用时,如果当前页面的楼层接近一百了,就提示快要分页了,否则提示距离分页大约还需多少次回覆。事隔几年,我再去天涯论坛看时,发现盼着分页的风气好像不在,而且天涯的页面HTML也已经修改,原来的小程序失效了。

控制台

随着web系统前端发挥的作用越来越大,java script脚本也变得越来越复杂,功能更强大的编写和调试工具应需而生。Firefox的Firebug插件就属于第一批登场的优秀的web开发工具。其中的控制台为java script提供了这一类解释型语言常用的控制台,即测试和开发环境――输入脚本,运行,打印出运行结果,并且能访问当前页面的环境。这是比上一节说的地址栏更方便全面的hacking的场所。随后的各大浏览器都推出了集成的web开发工具,功能也都大同小异,java script控制台是共同的功能项,在这里可以像网页原先的前端开发者一样,任意获取页面信息、转换和修改。此外,由于很多网页都使用了某种java script库或框架,在控制台里也可以直接调用这些库的方法。如果说此处对页面的修改是临时性的、一次性的为了乐趣的涂鸦,获取和整理页面中的信息却可以有真实的用处。

我在CSDN的博客写了一系列关于Lotus Domino开发的文章后,申请了一个专栏,要将博客里的文章一篇篇手动添加到专栏里,也是个不大不小的重复的劳动:

1. 将鼠标移动到一篇文章的链接上。

2. 点击右键,弹开快捷菜单。

3. 选择菜单里的复制链接地址。

4. 转到管理专栏的页面。

5. 选中添加文章地址的文本框。

6. 粘贴刚刚复制的地址。

7. 用键盘或者鼠标将焦点移动到文本框右边的“添加”按钮。

8. 点击按钮完成一次添加。

9. 转回博客文章列表的页面。

以上九步原子化的步骤,需要重复好几十次,而且复制链接地址的时候还要小心别弄错。对于程序员来说,重复几乎意味着犯罪。于是我查看了页面的源代码,打开博客的目录视图页面,在浏览器的java script控制台里运行如下脚本:

//自动添加文章到专