2011-03-08 17 views
4

已經在一些庫中進行了黑客攻擊,並且遇到了一個字符串被「雙重轉義」的問題。Ruby(Rails)使用字符串 - 撤消Array.to_s

例如: 固定例如

> x = ['a'] 
=> ["a"] 
> x.to_s 
=> "[\"a\"]" 
> 

然後再次

\"\[\\\"s\\\"\]\" 

這是在處理HTTP頭髮生。我有一個頭,這將是一個數組,但http庫正在做它自己的字符逃避array.to_s值。

我發現的解決方法是將數組自己轉換爲字符串,然後'撤消'to_s。像這樣: FORMATTED_VALUE = value.to_s

if value.instance_of?(Array) 
    formatted_value = formatted_value.gsub(/\\/,"") #remove backslash             
    formatted_value = formatted_value.gsub(/"/,"") #remove single quote 
    formatted_value = formatted_value.gsub(/\[/,"") #remove [                          
    formatted_value = formatted_value.gsub(/\]/,"") #remove ] 
end 
value = formatted_value 

...有一定有一個更好的辦法...(無需猴修補我使用的寶石)。 (是的,如果我的字符串實際上包含那些字符串,這個中斷)。

建議?

**更新2 **

好的。在這附近仍然有麻煩,但現在我想我已經找出了核心問題。它是在to_s調用之後將我的數組序列化爲json。至少,這似乎正在重現我所看到的。

[「一」]。to_s.to_json

我打電話在返回一個to_s結果的寶石的方法,然後我打電話to_json就可以了。

+1

你的例子用'x。to_s'導致您顯示的格式不是正常行爲。爲什麼要將字符串轉換爲數組?你在這裏覆蓋了一些你沒有告訴我們的東西嗎? – jdl 2011-03-08 16:52:04

+0

我認爲你應該澄清你的問題和/或添加更多「雙逃避」的例子。如果要將它們放入雙引號字符串中,雙引號必須轉義。 – 2011-03-08 17:57:03

+0

我同樣困惑。我在'irb'中做你的例子,並沒有得到你的結果(沒有真正期待)。爲什麼字符串會自動變成一個數組? – nzifnab 2011-03-08 18:26:03

回答

7

我已經編輯我的答案因你編輯的問題:

我還是不能重複你的結果!

>> x = ['a'] 
=> ["a"] 
>> x.to_s 
=> "a" 

但是,當我改變這最後一次通話:

>> x.inspect 
=> "[\"a\"]" 

所以我會認爲這是你在做什麼?

它不一定會轉義值 - 本身。它存儲的字符串是這樣的:

%{["a"]} 

或者說:

'["a"]' 

在任何情況下。這應該工作到非字符串化它:

>> x = ['a'] 
=> ["a"] 
>> y = x.inspect 
=> "[\"a\"]" 
>> z = Array.class_eval(y) 
=> ["a"] 
>> x == z 
=> true 

我懷疑使用class_eval雖然安全岬,警惕的用戶輸入,因爲它可能會產生非預期的副作用(和我的意思代碼注入攻擊),除非你確定你知道原始數據來自哪裏,或者允許通過什麼。

+0

謝謝。我肯定搞砸了 – 2011-03-08 19:21:08

+0

這個問題的例子@John我編輯了我的答案,以反映你的新問題。 – nzifnab 2011-03-08 20:25:27