`
awfwxf
  • 浏览: 68496 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

避免发生与安全有关的javascript错误

阅读更多
會產生 JavaScript錯誤:

eval() 函數

setTimeout() 和 setInterval()

Function 建構函式

此外,使用下列類型的 JavaScript 陳述式也會失敗,並且不會產生不安全的 JavaScript 錯誤:

javascript: URL

在 innerHTML 和 outerHTML 陳述式中透過事件之特質指定的事件回呼

載入位於應用程式安裝目錄以外的 JavaScript 檔案

document.write() 和 document.writeln()

在 load 事件傳送之前或在 load 事件處理常式期間初始化的同步 XMLHttpRequest

動態建立的 Script 元素

備註: 在某些受到限制的情況下,可以執行評估字串作業。如需詳細資訊,請參閱不同安全執行程序中內容的程式碼限制。
Adobe 已整理出一份支援應用程式安全執行程序的 Ajax 架構清單,請造訪 http://www.adobe.com/go/airappsandboxframeworks_tw 以取得這份清單。

下列幾節將說明如何重新撰寫 Script 來避免這些不安全的 JavaScript 錯誤和不會產生訊息的錯誤,以便在應用程式安全執行程序中執行程式碼。

將應用程式內容對應至不同的安全執行程序
在大部分情況下,您都可以重新撰寫應用程式或重新建立其架構,避免發生與安全性有關的 JavaScript 錯誤。不過,在無法重新撰寫或重新建立架構的情況下,您可以使用將應用程式內容載入至非應用程式安全執行程序中所述的技巧,將應用程式內容載入至不同的安全執行程序中。如果該項內容也必須存取 AIR API,您可以如設定安全執行程序橋接介面中所述,建立新的安全執行程序橋接。

eval() 函數
在應用程式安全執行程序中,eval() 函數只能在網頁的 load 事件傳送之前,以及在 load 事件處理常式執行期間使用。網頁完成載入之後,呼叫 eval() 將不會執行程式碼。不過,在下列情況中,您可以重新撰寫程式碼以避免使用 eval()。

將屬性指定給物件
請不要透過下列所示方式剖析字串來建置屬性存取子:

eval("obj." + propName + " = " + val);請改以方括號標記法來存取屬性:

obj[propName] = val;使用可以在內容中使用的變數來建立函數
請將下列陳述式:

function compile(var1, var2){
    eval("var fn = function(){ this."+var1+"(var2) }");
    return fn;
}取代成為:

function compile(var1, var2){
    var self = this;
    return function(){ self[var1](var2) };
}使用類別名稱做為字串參數來建立物件
假設使用下列程式碼定義假設性的 JavaScript 類別:

var CustomClass = 
    {
        Utils:
        {
            Parser: function(){ alert('constructor') }
        },
        Data: 
        {
        
        }
    };
var constructorClassName = "CustomClass.Utils.Parser";建立實體的最簡單方式,就是使用 eval():

var myObj;
eval('myObj=new ' + constructorClassName +'()')不過,您可以剖析該類別名稱的其中每一個字元,並使用方括號標記法建置新物件,以避免呼叫 eval():

function getter(str)
{
    var obj = window;
    var names = str.split('.');
    for(var i=0;i<names.length;i++){
        if(typeof obj[names[i]]=='undefined'){
            var undefstring = names[0];
            for(var j=1;j<=i;j++)
                undefstring+="."+names[j];
            throw new Error(undefstring+" is undefined");
        }
        obj = obj[names[i]];
    }
    return obj;
}若要建立實體,請使用:

try{
    var Parser = getter(constructorClassName);
    var a = new Parser();
    }catch(e){
        alert(e);
}setTimeout() 和 setInterval()
請以函數參考或物件取代傳遞做為處理常式函數的字串。例如,將下列陳述式:

setTimeout("alert('Timeout')", 10);取代成為:

setTimeout(alert('Timeout'), 10); 或者,當這個函數需要由呼叫者來設定 this 物件時,將下列陳述式:

this.appTimer = setInterval("obj.customFunction();", 100);取代成為:

var _self = this;
this.appTimer = setInterval(function(){obj.customFunction.apply(_self);}, 100);Function 建構函式
對 new Function(param, body) 的呼叫可以取代為行內函數宣告,或者只在處理 load 事件之前使用這個呼叫。

javascript: URL
在應用程式安全執行程序中,使用 javascript: URL 配置在連結中定義的程式碼會遭忽略,這不會產生不安全的 JavaScript 錯誤。您可以將如下所示使用 javascript: URL 的連結:

<a href="javascript:code()">Click Me</a>取代成為:

<a href="#" onclick="code()">Click Me</a>在 innerHTML 和 outerHTML 陳述式中透過事件之特質指定的事件回呼
當您使用 innerHTML 或 outerHTML 將元素加入至文件的 DOM 時,所有在陳述式中指定的事件回呼 (例如 onclick 或 onmouseover) 都會遭忽略,這不會產生安全性錯誤。您可以改為將 id 特質指定給這些新元素,並使用 addEventListener() 方法設定這些事件處理常式回呼函數。

舉例來說,您可以在文件中指定某個目標元素,如下所示:

<div id="container"></div>將下列陳述式:

document.getElementById('container').innerHTML = 
    '<a href="#" onclick="code()">Click Me.</a>';取代成為:

document.getElementById('container').innerHTML = '<a href="#" id="smith">Click Me.</a>';
document.getElementById('smith').addEventListener("click", function() { code(); });

原文:http://help.adobe.com/zh_TW/AIR/1.1/devappsflash/WS5b3ccc516d4fbf351e63e3d118666ade46-7f0e.html
0
0
分享到:
评论

相关推荐

    javascript学习笔记.docx

    f) 继承:只是在查询一个属性时自动发生,而不会在写属性时发生,就是说单写一个父类的属性时,JavaScript环境会为对象本身创建一个同名的属性,从此该属性就覆盖了父类中的属性。 12) 创建一个数组可用 new Array()...

    微软JavaScript手册

    catch 语句 包含在 try 语句块中的代码发生错误时执行的语句。 ceil 方法 返回大于或等于其数值参数的最小整数。 charAt 方法 返回位于指定索引位置的字符。 charCodeAt 方法 返回指定字符的 Unicode 编码。 ...

    javascript文档

    javascript的官方文档 这些方便实用的信息将帮助您了解 JScript 的各个部分。 在“字母顺序的关键字列表”中,可以找到按字母顺序列出的所有 JScript 语言的主题。如果只需要查看某个主题(例如对象),则有对该主题...

    DWR.xml配置文件说明书(含源码)

    所以应该要避免这种情况的发生. 一种情况是因为解析器是一个语法宽松的解析器,他不象编译器一样对语法有非常严格的要求,所有有时可能一些重要的语句没有配置而无法事先发现. &lt;![CDATA[ import java.util.List; ...

    大名鼎鼎SWFUpload- Flash+JS 上传

     SWFUpload是一个客户端文件上传工具,最初由Vinterwebb.se开发,它通过整合Flash与JavaScript技术为WEB开发者提供了一个具有丰富功能继而超越传统标签的文件上传模式。 [编辑本段]SWFUpload的主要特点  * 可以...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -重新设计模拟树的下拉列表的实现,避免选中某项后的闪烁。 +2009-11-21 v2.1.5 +Tree优化。 -修正Expanded项和Checked项的状态在回发改变后不能保持的BUG。 -GetNodeById更名为FindNode,保持和...

    McAfee 8.0 简体中文

    使用此功能可以在执行 JavaScript 和 VBScript 脚本之前对其进行 扫描。脚本扫描程序能够象真正的 Windows 脚本主机组件的代理组件一 样运行。它可以阻止脚本(例如 Internet Explorer 网页脚本)的执 行并对...

    ExtAspNet_v2.3.2_dll

    -重新设计模拟树的下拉列表的实现,避免选中某项后的闪烁。 +2009-11-21 v2.1.5 +Tree优化。 -修正Expanded项和Checked项的状态在回发改变后不能保持的BUG。 -GetNodeById更名为FindNode,保持和...

    测试培训教材

    测试管理与QualityCenter培训手册 1、测试流程管理、测试度量方法 按照尽早进行测试的原则,测试人员应该在需求阶段就介入,并贯穿软件开发的全过程。就测试过程本身而言,应该包含以s下几个阶段。  -测试需求的...

    代码之美(中文完整版).pdf

    虽然本书的涉猎范围很广,但也只能代表一小部分在这个软件开发这个最令人兴奋领域所发生的事情。 本书收录的是软件设计领域中的一组大师级作品。每一章都是由一位或几位著名程序员针对某个问题给出的完美的解决方案...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    Java的产生与流行是当今Internet发展的客观要求,Java是一门各方面性能都很好的编程语言,它的基本特点是简单、面向对象、分布式、解释的、健壮的、安全的、结构中立的、可移植的、性能很优异的、多线程的、动态的,...

    jquery插件使用方法大全

    由于目前高校基本尚未开JavaScript的相关课程,目前jQuery的学习,使用,研究都仅限于在职Web程序员之间。 用jq的前提,首先要引用一个有jq的文件 [removed][removed] 这个是jquery官方最新的地址。可用在自己网站...

    .htaccess

    .htaccess isn't difficult to use and is really just made up of a few simple instructions in a text file. 从本指南中,你将可以学习到有关.htaccess文件及其功能的知识,并用以优化你的网站。尽管....

Global site tag (gtag.js) - Google Analytics