2009-08-26 142 views
2

我經常聽到這個說法(在javascript中,但許多語言具有類似eval的特性),使用eval是「不好的」。這些論點是,你認爲使用eval的大部分事情可以通過其他方式完成,在大多數情況下,eval的速度非常慢,並且它可以允許用戶輸入要執行的代碼(如果未採取適當的預防措施)。我們知道大多數功能不僅僅是固有的「壞」,而是讓我們關注eval,什麼時候應該使用eval(將字符串作爲代碼在運行時執行)?

eval的一些有效用途是什麼? (除了爲開發人員調試應用程序提供了一個很好的功能)

回答

6

eval()有好有壞的一點。任何語言支持eval的最糟糕的方面是,它會打開安全漏洞的大門。如果開發人員能夠弄清楚如何獲得任何自定義代碼,那麼他就可以寫入應用程序的eval語句中,然後他可能會執行各種惡意的事情,如竊取私有數據或禁用應用程序提供的服務。性能是您已經表達的另一個關注點。

Eval真的能夠在您的代碼可能需要動態生成其他代碼以輕鬆執行復雜任務的區域中發光。我現在想不出一個例子,但是任何你需要這樣做的情況都可能不會是微不足道的。我建議只在絕對必要的時候這樣做才能儘量減少我在前一段中提到的問題的風險。如果可能,永遠不要相信用戶輸入足夠安全以使用eval。

7

A read-eval-print loop通常會使用eval實現。

+0

您應該始終引用您鏈接的頁面中最相關的部分,讓讀者知道您在說什麼。請參閱http://stackoverflow.com/help/how-to-answer。 – 2016-10-25 05:39:35

2

eval的缺陷與SQL注入一樣。如果你在你的代碼中動態地構造字符串並且在這個罰款上調用eval。但是,如果你的代碼是盲目地將用戶輸入連接到一個字符串中進行評估,那麼你就是在要求它。有很多情況下,eval可能是有用的,但人們往往會避免它,因爲還有其他方法可以解決eval的需求。

0

從可信來源解碼json。像在圖形計算器中一樣評估用戶輸入的表達式。想不到太多的東西,雖然它在90年代後期被不想學習訪問頁面元素的正確方法的人所濫用。

+0

您可以在不使用eval的情況下解碼JSON。它只是發生,json2.js使用eval。 – 2009-08-27 03:04:11

0

我曾經寫過一個perl CGI腳本,它的輸出是perl代碼,它被另一臺機器上的另一個腳本和eval()'d所檢索。這只是安全的,因爲我是在控制兩端,但它確實解決了一個問題,否則這就要求我在XML廣爲人知之前的一個時代發明某種序列化格式。

1

它使得metaprogramming一竅不易。很好,如果你想以某種方式分析一個程序(例如,爲了調試或分析目的)。

0

eval的唯一合法用途是執行您無法控制的代碼(除非您製作javascript sandbox,否則您不應該這樣做)。

相關問題