我正在創建一個Rails應用程序,該應用程序有多個客戶端的電子商務元素 - 我希望這些客戶端能夠在管理區域中指定計算其運費的公式;因爲這些方法可能不同。在Ruby中解釋用戶輸入的表達式(安全地)
讓我們暫時假裝我允許他們輸入紅寶石代碼,然後我在稍後(在計算訂單運送時)評估結果 - 它會相當靈活,如果我建立一些適當的變量預先,可以輸入不同的公式,如:
- 5.00 #A靜態量 - 總是充5.00
- order.total * 0.1 #10的順序值的%
- [order.total * 0.1,3.00] .max #總量的10%,或3.00,取較大
- order.shipping_abroad? ? 10.00:5.00 #爲海外客戶10.00,5.00,爲國內
...當然,百個變化就這些主題。
現在,問題是將代碼評估爲紅寶石將是一個安全的噩夢,允許他們掏空系統,訪問我的數據庫,並且通常會造成嚴重破壞,無論是意外還是設計。根據我的理解,$ SAFE似乎不是安全的保證。所以,我的實際問題(是的,我確實有一個,最終!)是:是否有一個簡單,安全的腳本語言,我可以允許用戶輸入表達式(使用我預先設定的變量),然後計算表達式的結果,但不允許系統調用,數據庫訪問等?
我必須能夠在ruby中解釋和運行語言,但語言本身並不一定是紅寶石 - 它可以是任何東西,但我更喜歡它對客戶來說是相當可讀的,並且能夠應付我在上面的ruby示例中使用的那種表達式。布朗尼指出,如果我有能力在輸入表達式時對錶達式進行語法檢查,以便向客戶端指出任何明顯的錯誤。
(除非,當然,你可以點我如何做一個「安全的」,沙盒在紅寶石的eval,這將符合要求以及方向。)
或重新定義任何東西! – OscarRyz 2011-02-10 22:37:45