Joh*_*gan 4 ruby string ruby-on-rails http http-headers
一直在乱砍几个库,并遇到一个字符串被"双重逃脱"的问题.
例如: 固定示例
> x = ['a']
=> ["a"]
> x.to_s
=> "[\"a\"]"
>
Run Code Online (Sandbox Code Playgroud)
然后再来
\"\[\\\"s\\\"\]\"
Run Code Online (Sandbox Code Playgroud)
在处理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
Run Code Online (Sandbox Code Playgroud)
......有一个更好的方法......(不需要修补我正在使用的宝石).(是的,如果我的字符串实际上包含那些字符串,那么这个休息.)
建议?
**更新2**
好的.在这个街区仍然有麻烦,但现在我想我已经找到了核心问题.在to_s调用之后,它将我的数组序列化为json.至少,这似乎正在复制我所看到的.
[ 'A'].to_s.to_json
我正在调用一个返回to_s结果的gem中的方法,然后我在它上面调用to_json.
由于您编辑过的问题,我已经编辑了我的答案:
我仍然无法复制你的结果!
>> x = ['a']
=> ["a"]
>> x.to_s
=> "a"
Run Code Online (Sandbox Code Playgroud)
但是当我改变最后一次调用时:
>> x.inspect
=> "[\"a\"]"
Run Code Online (Sandbox Code Playgroud)
所以我会假设你正在做的事情是什么?
这不一定是逃避价值 - 本身.它存储的字符串如下:
%{["a"]}
Run Code Online (Sandbox Code Playgroud)
更确切地说:
'["a"]'
Run Code Online (Sandbox Code Playgroud)
在任何情况下.这应该可以解除它的串行化:
>> x = ['a']
=> ["a"]
>> y = x.inspect
=> "[\"a\"]"
>> z = Array.class_eval(y)
=> ["a"]
>> x == z
=> true
Run Code Online (Sandbox Code Playgroud)
我怀疑使用的安全岬class_eval
不过,警惕的用户输入,因为它可能会产生非预期的副作用(和我的意思是代码注入攻击),除非你非常确定你知道的原始数据从哪里来来自,或允许通过它.
归档时间: |
|
查看次数: |
5067 次 |
最近记录: |