我有一个Rails应用程序,必须与一个非常古老的遗留应用程序共存。旧应用程序查找具有包含特定字符串的值的cookie。不幸的是,遗留cookie中的字符通常包含斜杠。我遇到的问题是,当Rails应用程序写入cookie时,它首先进行URL编码,导致遗留应用程序中断,因为cookie值不正确。
我通过编辑文件cookie_performance_fix.rb
(路径:./actionpack-1.13.5/lib/action_controller/cgi_ext/cookie_performance_fix.rb
)来使用Rails 1.13.5
为了实现这一点,我改变了代码,如下所示:
def to_s
buf = ""
buf << @name << '='
if @value.kind_of?(String)
rails code.
#buf << CGI::escape(@value)
buf << @value
else
#buf << @value.collect{|v| CGI::escape(v) }.join("&")
buf << @value.collect{|v| (v) }.join("&")
end
这实际上工作正常,直到我决定将Rails升级到版本2.3.2
在Rails 2.3.2中,cookie_performance_fix.rb
文件不再存在。我查看了同一目录,发现了一个名为cookie.rb
的文件,我尝试以类似的方式进行修改。
def to_s
buf = ''
buf << @name << '='
#buf << (@value.kind_of?(String) ? CGI::escape(@value) : @value.collect{|v| CGI::escape(v) }.join("&"))
buf << (@value.kind_of?(String) ? @value : @value.collect{|v| (v) }.join("&"))
buf << '; domain=' << @domain if @domain
buf << '; path=' << @path if @path
buf << '; expires=' << CGI::rfc1123_date(@expires) if @expires
buf << '; secure' if @secure
buf << '; HttpOnly' if @http_only
buf
end
遗憾的是,这似乎不起作用。 cookie不断在新的Rails 2.3.2中进行URL编码。我知道关闭URL编码不是最好的主意,但在遗留应用程序退役之前我没有太多选择。遗憾的是,我无法访问遗留代码以添加对URL的解码 - 解码cookie,因此我必须确保使用正确的序列(包括斜杠)编写旧cookie。如果有人能告诉我如何在Rails 2.3.2中关闭URL编码,我们将不胜感激 感谢。
答案 0 :(得分:4)
在做了一些挖掘后,我找到了我的问题的答案,我在这里记录它,以防它对其他人有用。
为了在Rails 2.3.2中关闭URL编码,需要编辑以下文件: actionpack-2.3.2 / lib / action_controller / vendor / rack-1.0 / rack / response.rb < / strong>
在第70行附近设置了cookie的ID和值。我做了以下更改以转换URL编码:
cookie = Utils.escape(key) + "=" +
#value.map { |v| Utils.escape v }.join("&") +
value.map { |v| v }.join("&") +
"#{domain}#{path}#{expires}#{secure}#{httponly}"
注意:此修改仅影响标准Cookie - 而不是版本2.3.2中Rails用作会话数据的Cookie。
免责声明:我绝不建议将此修改作为最佳做法。此修改仅用于处理遗留代码要求的特定原因,该要求要求cookie采用特定格式。更好的选择甚至是修改遗留代码以处理URL编码。不幸的是,这个选项对我来说是封闭的,所以我不得不在底层的Rails代码上进行攻击 - 这不是我通常会推荐的。当然,不言而喻,进行这种类型的修改会冒着每次升级Rails安装时必须重新解决问题的风险,因为底层代码可能会发生变化。这实际上就是我的情况。当然,如果可能的话,也可能有很好的理由(安全性,标准合规性等)来保持URL编码。
答案 1 :(得分:1)
一种简单的方法是使用机架方法,
response["set-cookie"]="id_cookie=this cookie will be not escaped"