is eval evil?

最近項目中, 一個為了確保安全性而做的任務(wù)是移除代碼中的eval. 我對eval的不好略有耳聞, 但是它到底有多不好? 今天了解下.

Douglas Crockford說過:

The eval function (and its relatives, Function, setTimeout, and setInterval) provide access to the JavaScript compiler. This is sometimes necessary, but in most cases it indicates the presence of extremely bad coding. The eval function is the most misused feature of JavaScript.

這句話被很多人用來佐證eval的不好. eval被認(rèn)為為攻擊者進(jìn)行Cross-Site Scripting (XSS) 攻擊創(chuàng)造了便利. 但其實使用得當(dāng), eval并沒有什么問題.

錯誤應(yīng)用

比方說下面這段代碼, 利用eval去判斷一個表單元素是否被選中.

function isChecked(optionNumber) {
    return eval("forms[0].option" + optionNumber + ".checked");
}

var result = isChecked(1);

這段代碼很容易用沒有eval的方式實現(xiàn).

function isChecked(optionNumber) {
    return forms[0]["option" + optionNumber].checked;
}

var result = isChecked(1);

這類似錯誤的eval應(yīng)用可以簡單地使用[]來避免.

調(diào)試

eval中的代碼為調(diào)試帶來了難度. 現(xiàn)在Chrome Dev Tool可以debugeval中的代碼, 但是仍然很麻煩. 所以, 從這點出發(fā), 為了開發(fā)效率, 也盡量不要用eval.

效率

舊的瀏覽器中, 如果你使用eval, 瀏覽器就要進(jìn)行兩次解析. 第一次解析JS代碼本身, 第二次解析eval中的代碼. 在不帶JS編譯引擎的瀏覽器中, 效率可能相差十倍.

即使對于帶JS編譯引擎的瀏覽器, eval還是有問題. 大多數(shù)引擎運行代碼時會在兩種模式中選擇: 一個是fast path, 一個是slow path. 如果代碼穩(wěn)定, 比較容易預(yù)測, 那么引擎會使用fast path運行代碼, 效率高很多. 如果代碼很難預(yù)測, 那只能用slow path運行了. 由于帶eval的代碼本身很難預(yù)測, 所以會走slow path, 因此也會造成效率低下.

安全性

eval最讓人頭疼的地方就是安全性了. 如果你將用戶的輸入作為eval的參數(shù), 那么就有XSS的風(fēng)險. 但是你只要確保不做出這種事, 使用eval也是沒什么問題的.

另外一點是, 有些人說, 如果你使用eval去運行瀏覽器返回的代碼, 那么就有可能受到中間人攻擊 (man-in-the-middle attack). 但是事實上, 如果一個人真的做到了中間人攻擊, 除了用eval, 有更多簡單的方法讓他運行惡意代碼, 比如:

  1. 在代碼中插入<script src="">并引用惡意代碼.
  2. 在JSON-P或者Ajax請求中插入惡意代碼.

另外, 中間人攻擊可以獲取用戶的cookie或者其他信息, 同時不篡改任何信息, 不被察覺. 這本身也是安全隱患, 與eval無關(guān).

總之, 如果你無法相信瀏覽器返回的代碼, 那這本身產(chǎn)生的問題就遠(yuǎn)比eval的問題大得多.

總結(jié)

eval在調(diào)試和效率有不好的影響, 有一定的安全性隱患, 但是只要注意就可以避免. 總體來說, eval盡量不要用.

參考

  1. eval() isn’t evil, just misunderstood
  2. Why is using the JavaScript eval function a bad idea?
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锐帜,一起剝皮案震驚了整個濱河市挟纱,隨后出現(xiàn)的幾起案子轰坊,更是在濱河造成了極大的恐慌病线,老刑警劉巖主籍,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異乳愉,居然都是意外死亡兄淫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門蔓姚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捕虽,“玉大人,你說我怎么就攤上這事赂乐∈眵ⅲ” “怎么了咖气?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵挨措,是天一觀的道長。 經(jīng)常有香客問我崩溪,道長浅役,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任伶唯,我火速辦了婚禮觉既,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乳幸。我一直安慰自己瞪讼,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布粹断。 她就那樣靜靜地躺著符欠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓶埋。 梳的紋絲不亂的頭發(fā)上希柿,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天诊沪,我揣著相機與錄音,去河邊找鬼曾撤。 笑死端姚,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挤悉。 我是一名探鬼主播渐裸,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼尖啡!你這毒婦竟也來了橄仆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤衅斩,失蹤者是張志新(化名)和其女友劉穎盆顾,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畏梆,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡您宪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了奠涌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宪巨。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖溜畅,靈堂內(nèi)的尸體忽然破棺而出捏卓,到底是詐尸還是另有隱情,我是刑警寧澤慈格,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布怠晴,位于F島的核電站,受9級特大地震影響浴捆,放射性物質(zhì)發(fā)生泄漏蒜田。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一选泻、第九天 我趴在偏房一處隱蔽的房頂上張望冲粤。 院中可真熱鬧,春花似錦页眯、人聲如沸梯捕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽傀顾。三九已至,卻和暖如春忿族,著一層夾襖步出監(jiān)牢的瞬間锣笨,已是汗流浹背蝌矛。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留错英,地道東北人入撒。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像椭岩,于是被迫代替她去往敵國和親茅逮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容