2

我有一个 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

不幸的是,这似乎不起作用。在新的 Rails 2.3.2 中,cookie 不断得到 URL 编码。我知道关闭 URL 编码并不是最好的主意,但在遗留应用程序退役之前我没有太多选择。不幸的是,我无法访问旧代码来添加对 cookie 的 URL 解编码的支持,因此我必须确保使用正确的序列(包括斜杠)编写旧 cookie。如果有人能告诉我如何在 Rails 2.3.2 中关闭 URL 编码,将不胜感激。
谢谢。

4

2 回答 2

4

在进行了一些挖掘之后,我找到了我的问题的答案,我在这里记录它以防它对其他人有用。

为了在 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 - 不影响 Rails 在 2.3.2 版本中用作会话数据的 cookie。

免责声明:我绝不建议将此修改作为最佳实践。仅出于处理要求 cookie 采用特定格式的遗留代码要求的特定原因进行此修改。更好的选择甚至是修改遗留代码以处理 URL 编码。不幸的是,这个选项对我来说是关闭的,所以我不得不修改底层的 Rails 代码——这不是我通常推荐的。当然,不言而喻,进行这种类型的修改会带来风险,即每次升级 Rails 安装时都必须重新解决问题,因为底层代码可能会发生变化。这实际上就是我的情况。当然,如果可能的话,也可能有充分的理由(安全性、标准合规性等)来保持 URL 编码。

于 2009-07-15T21:27:22.447 回答
1

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

response["set-cookie"]="id_cookie=this cookie will be not escaped"
于 2011-12-24T07:35:51.537 回答