2017-09-13 55 views
0

我有一些數據值來自表單,它們是不同數據類型的字符串化版本 - 字符串,數組,哈希等:它們都是對原始數據調用「檢查」的結果。更安全的Ruby替代「eval」,對某些字符串做「un-inspect」?

當我讓他們回來,我想他們再次保存到該對象在原來的預檢查的形式 - 即作爲一個散列,數組,符號等

很顯然,我可以叫「 eval「,但這些數據來自表單,因此易受」Bobby Tables「sql注入影響,或者甚至只是一個像」User.delete_all「這樣的Ruby調用(這很難被警告 - 至少Rails有一些方法可用於清理sql)。它位於網站的管理部分,只有幾個值得信賴的人會使用它,但我仍然希望找到一種更安全的方式。

爲了讓事情更難,這是在Ruby 1.8.6和Rails 2.2.2(只是不 - 我知道!)。

有沒有辦法在不調用eval的情況下反轉「檢查」方法,或者這在邏輯上是一回事嗎?以下是我想要轉換的一些示例值。

"\"Instrument Home\"" => "Instrument Home" 
":foo" => :foo 
"[\"1311089\", \"1311128\", \"1310802\"]" => ["1311089", "1311128", "1310802"] 
"{:foo=>\"bar\"}" => {:foo => "bar"} 

編輯:這是我的形式是什麼樣子: enter image description here

和形式是如何設置的:

<% @digilearning_module.metadata_keys_and_values.each do |num, hash| %> 
     <tr> 
     <td><%= text_field_tag "digilearning_module[metadata_keys_and_values][#{num}][key]", hash[:key].inspect %></td> 
     <td>=></td> 
     <td><%= text_area_tag "digilearning_module[metadata_keys_and_values][#{num}][value]", hash[:value].inspect %></td> 
     </tr> 
    <% end %> 

以及數據如何回來的(我省略了大部分爲了清楚起見,來自大陣列的值)。

params[:digilearning_module][:metadata_keys_and_values] = { 
    "1"=>{"value"=>"[\"1311089\", \"1311128\", \"1310802\"]", "key"=>":tablet_compatible_child_mod_numbers"}, 
    "2"=>{"value"=>"\"Instrument Home\"", "key"=>":special_category"} 
} 

當我處理這個,我丟掉的只是在那裏單獨的鍵和值出到一個哈希數字。然後我讀了密鑰和數據值回爲鍵和這實際上是保存到數據庫的哈希值:所以上面我將要結束了

{:tablet_compatible_child_mod_numbers => ["1311089", "1311128", "1310802"], :special_category => "Instrument Home"} 
+1

_「來自表單的值」_ - 一個HTML表單?你在使用Web框架嗎? _「將它們保存到對象中_」 - 如何將對象保存在數據庫中?你有ORM嗎?或者換句話說:這是Rails的問題嗎? – Stefan

+0

@Stefan是的,這是一個軌道問題,對不起,我應該提到這一點。我會編輯。 –

+0

你能舉個例子嗎?特別是如何將數據傳遞到表單並將其發送回服務器。 – Stefan

回答

2

如果你不需要符號類型,那麼我在Stack Overlow上看到的一種流行方式是使用JSON代替Ruby對象。您可以在Ruby對象和JSON之間進行映射,並安全地編碼和解碼JSON。

+0

啊,好主意,謝謝。我確實需要符號,但我可能能夠解決這個問題。 –

相關問題