為什么在javascript不建議使用eval()函數?


eval偽裝
超時函數setTimeout和setInterval都接受字符串作為第一個參數,該字符串將在全局作用域執行,因為eval不是被直接調用的。

安全問題
eval也存在一個安全問題,因為它可以執行傳給它的任何字符串,所以永遠不要傳入字符串或者來歷不明和不受信任源的參數。

 


這個例子中,由於響應的文本包含一個匿名函數,這個函數會修改頁面中的第一個表單的action特性,導致表單在提交時,所有數據都會被提及給一個 不同的服務器。因此,如果不對json數據進行過濾就直接將其傳遞給eval()的情況下,很有可能受到XSS攻擊。因為服務器返回的任何 javascript代碼在傳遞給eval()之后,都會在頁面的上下文中求值,它就可以像類成員一樣運行,對頁面中的數據進行操縱。

因此,我們應該避免將服務器返回的javascript函數傳入eval()函數中。

處理JSON串
處理JSON串需要添加"("和")"。

eval的作用域
在FF和Chrome下,下面兩段代碼有很大區別(IE沒有這個問題,神奇的瀏覽器~):
代碼一(局部作用域,IE下采用這種方式):

代碼二(全局作用域,IE下采用execScript代替):

 

如果不用eval()函數能用什么替代

《高性能Javascript》一書即指出:
警告:關於JSON和eval需要注意的是:在代碼中使用eval是很危險的,特別是用它執行第三方的JSON數據(其中可能包含惡意代碼)時,
盡可能使用JSON.parse()方法解析字符串本身。該方法可以捕捉JSON中的語法錯誤,並允許你傳入一個函數,用來過濾或轉換解析結果。
如果此方法以備Firfox 3.5 、IE8 及 Safari 4 原生支持。大多數javascript類庫包含的JSON解析代碼會直接調用原生版本,
如果沒有原生支持的話,會調用一個略微不那么強大的非原生版本來處理。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM