2016-01-27 33 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。我已经更新了答案。 –