2016-01-27 181 views
1

當看到錨標記時,rails清理方法會用雙引號替換單引號。Rails清理方法用雙引號替換單引號

sanitize("<a href='https://google.com'>google</a>") 
=> "<a href=\"https://google.com\">google</a>" 

這是有問題的,因爲在我的申請,我消毒,可以包含這些字符串,這會導致JSON是畸形的JSON有效載荷。

JSON.parse("{\"link\":\"<a href='https://google.com'>google</a>\"}") 
=> {"link"=>"<a href='https://google.com'>google</a>"} 

JSON.parse(sanitize(("{\"link\":\"<a href='https://google.com'>google</a>\"}")) 
=> JSON::ParseError 

我對輸入字符串沒有任何控制權。有沒有辦法阻止單引號轉換爲雙引號?

+0

爲什麼你不消毒只是用戶輸入(我不認爲鍵是用戶輸入)而不是完整的json? –

回答

0

這應該有效。相反消毒完整的JSON的,你可以清理用戶的輸入,然後再創建一個JSON:

link_html = "<a href='https://google.com'>google</a>" 
data = {"link" => sanitize(link_html)}.to_json 

它會創建這樣一個JSON:

"{\"link\":\"<a href=\\\"https://google.com\\\">google</a>\"}" 

在接收端JSON.parse將工作得很好:

irb(main):009:0> JSON.parse("{\"link\":\"<a href=\\\"https://google.com\\\">google</a>\"}") 
=> {"link"=>"<a href=\"https://google.com\">google</a>"} 
+0

否, 因爲用戶可能是邪惡的。 例如,他們可以編寫一個結束數據鏈接的部分json,並在其後添加新的字段。 – Meier

+0

那麼可能你應該先清理用戶輸入,然後創建json。我已經更新了答案。 –