如何在Rails中禁用cookie的URL编码

我有一个Rails应用程序,必须与一个非常古老的遗留应用程序共存。 旧应用程序查找具有包含特定字符串的值的cookie。 不幸的是,遗留cookie中的字符通常包含斜杠。 我遇到的问题是,当Rails应用程序写入cookie时,它首先执行URL编码,导致旧应用程序因为cookie值不正确而中断。

我通过编辑文件cookie_performance_fix.rb (路径: ./actionpack-1.13.5/lib/action_controller/cgi_ext/cookie_performance_fix.rb 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编码,我们将不胜感激。
谢谢。

在做了一些挖掘后,我找到了我的问题的答案,我在这里记录它,以防它对任何人都有用。

为了在Rails 2.3.2中关闭URL编码,需要编辑以下文件: actionpack-2.3.2 / lib / action_controller / vendor / rack-1.0 / rack / response.rb

在第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编码也可能有很好的理由(安全性,标准合规性等)。

一种简单的方法是使用机架方法,

 response["set-cookie"]="id_cookie=this cookie will be not escaped"