木子屋 Dnawo's BLOG

JavaScript的安全性

👤 dnawo 📅 2007-11-13 👁 1876 👍 0 💬 0 🔄 《JavaScript权威指南》 📂 脚本语言
由于Internet具有完全开放的性质,所以安全就成为一个非常重要的问题。引入Java与JavaScript这样的语言,尤其应该注意安全性,因为它们能够把可执行的内容嵌入静态网页中。由于装载网页可以使随机代码在你的计算机上运行,所以必须有严格的安全预防措施来防止恶意代码破坏数据或隐私。下边我们来说说客户端JavaScript防御恶意脚本的两道防线。

一、第一道防线:JavaScript语言去除了某些能力

例如,客户端JavaScript没有提供在客户的计算机上写文件、删除文件或者创建目录、删除目录的方法;还有,客户端JavaScript没有任何类型的联网原语,JavaScript可以URL,可以把HTML表单发送给Web服务器、CGI脚本和电子邮件地址,但它却不能和Web上的其他任何一个主机建立直接连接。

二、第二道防线:JavaScript为其支持的某些特性强加了一些限制

例如,客户端JavaScript支持Windows对象的方法close(),不过它对这一强加了一些限制,一个脚本只能用它关闭同一个Web服务器上的脚本打开的窗口。特别地,脚本不能关闭用户打开的窗口。如果它这样做了,就会出现一个确认框,询问他是否真的想关闭这个窗口。

1.同源策略

最重要的安全限制是同源策略(Same-Origin Policy),它是JavaScript中一条影响深远的安全限制。这条限制称为"同源"策略,即一个脚本只能读取与它同源(如由同一个主机下载、通过同一个端口下载或者下载协议相同)的窗口或文档的属性。

实际上,同源策略并非应用于不同源窗口中的所有对象的所有属性。不过它应用垤了其中的大多数属性,尤其是对Document对象的所有属性而言。出于各种目的,我们都应该把所有客户端对象的所有预定义属性都看作对非同源脚本有限制。虽然不同的实现有不同的规定,但非同源对象的用户定义的属性也可能受限制。

虽然同源策略是一种相当严格的限制,但要防止不可靠的脚本窃取私有信息,这一策略是必需的。如果没有这一制约,窗口的不可靠脚本(可能是通过防火墙装载到一个安全协作的内联网上的浏览器中的脚本)就可以用DOM方法读取另一个浏览器窗口中的内容,而该窗口可能会含有私有信息。

在某些环境中,同源策略就显得太过严格了。它给那些使用多个服务器的大站点增加了许多麻烦。例如,来自home.netscape.com的脚本可能会想要读从developer.netscape.com上的文档的属性,或者来自orders.acme.com的脚本可能需要读catalog.acme.com上的文档的属性,这都是合理的。为了支持这种类型的大网站,JavaScript 1.1引入了Document对象的属性domain。在默认情况下,属性domain存在的是装载文档的服务器主机名。可以设置这一属性,不过使用的字符串必须具有有效的前缀。因此,如果一个domain属性的初始值是"home.netscape.com",就可以把它设置成"netscape.com",但是不能把它设置成"home.netscape"或"cape.com",当然也不能设置成"microsoft.com"(domain值中至少要有一个点号,不能把它设为"com"或其他顶级域名)。

如果两个窗口(或框架)含有的脚本把domain设置成了相同的值,那么这两个窗口就不再受同源策略的约束,它们可以互相读取对方的属性。例如,从orders.acme.com和catalog.acme.com装载进来文档中的协作脚本可以把它们的document.domain属性都设置成"acme.com",这样一来,这些文档就有了同源性,可以互相读取属性。

2.其他限制

下面列出的是大多数客户端JavaScript实现中使用的其他安全限制。这并不是一个十分准确的列表。每个浏览器采用的安全限制可能稍有不同,每个浏览器的专有特性可能具有专门的安全限制。

● History对象原来是一个URL数组,表示浏览器的完整浏览历史。一旦它的私有性很明显,限制所有对URL的访问,Histroy对象就只剩下它的back()方法,forward()方法和go()方法,可以在历史数组中移动,但不会暴露数组的内容。

● 不能设置FileUpload对象的value属性。如果设置了该属性,脚本就可以把它设为任意文件名,使表单把指定的文件的内容(如口令文件)上载到服务器上。

● 在没有用户(通过确认对话框)明确同意时,脚本不能把表单提交给mailto:或news:URL(用Form对象的submit()方法)。这样的表单提交可能含有电子邮件地址,该地址在没有获得用户许可时不能把它公布于众。

● JavaScript程序在没有用户许可时不能关闭浏览器窗口,除非是它自身打开窗口。这阻止了恶意脚本调用self.close()方法关闭用户的浏览器窗口,因此使程序退出。

● 脚本不能打开边长小于100像素的窗口,也不能把窗口大小调整到边长小于100像素。同样,脚本不能把窗口移出屏幕,或创建比屏幕大的窗口。这可以防止脚本打开用户看不到或不容易注意到的窗口,这样的窗口含有的脚本可能在用户认为已经停止运行后仍在运行。此外,脚本不能创建没有标题栏的窗口,因为这样的窗口可以假冒操作系统对话框,欺骗用户输入区分大小的口令。

● 脚本不能创建显示about:URL的窗口或帧,如about:cache,因为这此URL能暴露系统信息,如浏览器缓存的内容。

● 脚本不能设置Event对象的任何属性。这可以防止脚本捏造事件。脚本不能给从不同来源装载的脚本注册事件监听程序或捕捉事件。这可以防止脚本把用户的输入(如口令的按键)窃取到另一个页面。

评论(0)

暂无评论。

计算题
评论需审核通过后显示
← 上一篇 在外部JS文件中获取其自身的地址 下一篇 → 郁闷,USB鼠标不能用