2011-06-06 52 views
1

我打算使用AJAX加載JS文件,然後評估它們來執行代碼。但我擔心使用eval。剛看到的jQuery如何實現getScript加入方法我通過它的源代碼去,發現這個:在使用eval執行動態JavaScript之前,jQuery如何清理動態加載的JavaScript文件?

rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/; 

jQuery.globalEval((elem.text || elem.textContent || elem.innerHTML || "") 
     .replace(rcleanScript, "/*$0*/")); 

globalEval是評估全球(窗口)上下文中的腳本和照顧或跨瀏覽器兼容的方法。但我不理解替換部分。通過它的名字,它看起來像rcleanScript被用來清理腳本,以便執行它是安全的。但我不明白它是如何工作的。

有人可以解釋這一點嗎?

編輯:我知道它是用/ $ /替換一些CDATA部分。但是,這是如何保證安全?從本質上講,如何在不替換CDATA部分的情況下執行腳本不安全?

回答

1

該正則表達式匹配的兩個不同的事情之一:

<![CDATA[ 
<!-- 

這些構造中經常使用的script元素的開始,以確保頁面驗證,它在不支持JavaScript的瀏覽器中正確呈現。正則表達式將它們放在Javascript註釋塊/* ... */中進行評論。這可以防止他們導致錯誤 - 顯然他們不是有效的Javascript,所以他們不能被評估。

replace的第二個參數中,$0表示由正則表達式匹配的整個子字符串。所以/*$0*/說「把所有匹配的正則表達式都放在註釋中」。

+0

但我只看到CDATA在HTML文件中使用。 JavaScript文件是否也包含CDATA部分?如果不是,爲什麼要更換? – Cracker 2011-06-06 23:17:15

+0

@Cracker您引用的代碼來自'evalScript'方法,該方法在將帶有JS內容的'script'元素附加到頁面時使用。那麼清理是必要的。所以你可以做'$('

2

基本上rcleanScript是一個正則表達式查找代碼可能是有害和"/*$0*/"手段替換一下rcleanScript發現使用/**/評論的部分路段。

+0

是的,我知道這一點。但是,它取代了什麼?如何用評論取代聲明使其安全?什麼是/ * $ 0 * /中的$ 0? – Cracker 2011-06-06 23:11:23

+0

它正在取代任何CDATA或評論部分。 $ 0是正則表達式找到的第一個匹配項。 – 2011-06-06 23:29:14

1

我只是偶然發現了這個問題,我不認爲有人真的回答了你的問題。他們解釋了正則表達式的作用,但不是「它是如何使它安全的?」。

答案就是這樣。正則表達式的重點不是去除任何類型的javascript攻擊,而是要解決IE中的一個錯誤,如果在要添加到頁面的某些HTML中的腳本標記中包含HTML註釋或CDATA部分JavaScript的。例如,在大多數JavaScript引擎(包括IE中使用的引擎)中,「<! - 」是有效的javascript單行註釋的開始,但如果嘗試調用eval,IE仍會出錯在包含「<! - 」的腳本上(這是jQuery DOM操作方法在將頁面元素添加到頁面時的作用)。 rcleanscript的目的是爲了解決這個問題。

如果你真的看了JavaScript規範,HTML風格的評論沒有被提及,因此無效,但jQuery的人想抓住人們在HTML評論中包裝腳本標籤內容的常見情況(這是一種方法隱藏不支持它的傳統瀏覽器的js代碼)。

此外,用「/ * $ 0 * /」取代註釋只是一個錯誤 - 因爲多種原因。開發者真正想說的是「/ * $ & * /」,這是替換js正則表達式匹配的完整匹配的正確語法($ 0是其他語言的語法)。此外,這甚至沒有解決IE問題,因爲它仍然抱怨「<! - 」,即使它包含在評論中。在以後的版本中,這兩個問題都是通過刪除匹配來解決的。