2

非常に古いレガシー アプリケーションと共存する必要がある Rails アプリケーションがあります。レガシ アプリケーションは、特定の文字列を含む値を持つ Cookie を探します。残念ながら、従来の Cookie の文字にはスラッシュが含まれていることがよくあります。私が抱えている問題は、Rails アプリケーションが Cookie を書き込むときに、最初に URL エンコードを行うことです。これにより、Cookie の値が正しくないため、レガシー アプリが壊れてしまいます。

ファイルを編集してRails 1.13.5でこれを機能させましたcookie_performance_fix.rb(パス./actionpack-1.13.5/lib/action_controller/cgi_ext/cookie_performance_fix.rb:)
これを機能させるために、次のようにコードを変更しました:

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 エンコーディングをオフにするのは最善の方法ではないことはわかっていますが、レガシー アプリケーションが廃止されるまではあまり選択肢がありません。残念ながら、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 に答える