2011-02-10 98 views
2

我正在創建一個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,這將符合要求以及方向。)

+0

或重新定義任何東西! – OscarRyz 2011-02-10 22:37:45

回答

1

用於輸入任意值,我會建議看一下液體模板或輻射標籤 - 你可以建立自己的模板語言來隔離解釋的代碼。

另一種方法是使用JavaScript(或Cof​​feeScript的),並集成了一個JS解釋 - 有一些是紅寶石連接到不同的虛擬機JS工具。

這就是說,我認爲通過一些智能UI來處理這個問題可能會更容易,而不是讓用戶輸入方程式。選擇幾種最可能的運輸選項,並構建一組用於輸入值的小部件,然後可以將其簡單地驗證爲整數。

你例子每個人實際上可以使用這種方法

  • 處理務必要充電:$ X
  • X的訂單價值總額的
  • X%,或$ Y的%,取更大

安全,從UX角度來看可能是更友好的方法。

+0

感謝您的評論。那裏有一些好點子。我很喜歡你的Javascript建議(johnson或therubyracer,也許),儘管你的模板選項之一可能是可行的,如果他們應付足夠複雜的表達式;我會檢查出來的! – NeilS 2011-02-10 22:47:03

0

有一個簡單,安全的腳本語言,我可以讓用戶輸入表達式

Lua一直被稱爲這樣。