2012-07-20 74 views
0

可能重複:
When is JavaScript's eval() not evil?Javascript Eval是邪惡的,但只在某些情況下?

我想知道,

除了Eval再次啓動的解釋,引起開銷,

的唯一情況,就是它可能很糟糕(除了我剛剛寫的東西十),是JS向服務器發送數據(即eval'd)。

我沒有看到任何其他場景,如果用戶想要玩js,他只能在他的瀏覽器邊界(除非JS與服務器交互)進行遊戲。

對嗎?

我很樂意進行更正。

+0

@canon我已經讀過,仍然沒有找到答案。 (除了我忘記提及調試問題) – 2012-07-20 20:40:11

+0

http://javascriptweblog.wordpress.com/2010/04/19/how-evil-is-eval/,http://berniesumption.com/software/eval -considered-useful/ – Blaster 2012-07-20 20:41:49

+0

如果你說明你爲什麼要使用eval,它會更有效。然後我們可以評估這是一個好主意。當然,除非你在理論上提出... – 2012-07-20 20:45:15

回答

3

嚴格來說,實際上並沒有什麼東西在使用eval時會產生有害的影響,因爲它只不過是瀏覽器的控制檯已經可以做的事。

存在潛在的注射危險,但這與將任何用戶提供的輸入放入<script>標記中相同,而不是eval的特殊性。

避免eval的主要原因是因爲它必須解釋一個字符串。現在,公平地說,僅僅運行一個JavaScript文件就像在整個文件(廣義地說)上調用一個偉大的大文件eval一樣,因爲JavaScript被解釋(或者至多在運行時被編譯)。因此,使用eval稀疏,只有在用戶點擊按鈕時纔會運行,這很好。只有當您經常運行eval(例如循環)時纔會出現明顯的效果。這就是爲什麼人們總是會告訴你傳遞一個函數到setTimeout而不是一個字符串,例如。

也就是說,有總是替代使用eval。它可能需要重寫舊代碼的一部分,但始終可以避免。

+0

什麼是「只有用戶沙箱」,「只有當客戶端與服務器通話時纔會受到傷害」 – 2012-07-20 20:48:00

+0

「eval」不會比瀏覽器的控制檯造成的傷害更大。例如,由於控制檯無法刪除計算機上的文件,因此無法「評估」。但是我的控制檯可以與服務器(AJAX,XSS等)通信,但這只是一個問題,如果糟糕的'eval'進入其他人的計算機 - 只有在您將用戶提供的內容注入其他人的頁面時纔會這樣做如與論壇) – 2012-07-20 20:49:45

+0

「實際上沒有什麼,在使用'eval'身體有害'」......好吧,技術上只有0。00001%左右的代碼是「物理上有害的」,所以在這個意義上你是正確的:-)然而,你認爲'eval'有一個性能成本是錯誤的(細節是根據代碼和瀏覽器)。你可以使用/不使用'eval'來運行完全相同的代碼,並且看到它使用'eval'執行得更慢,所以從這個意義上來說* *實際上對eval有害。 – machineghost 2012-07-20 21:01:18