2009-07-07 5 views
2

非常に古いレガシーアプリケーションと共存しなければならないRailsアプリケーションがあります。従来のアプリケーションでは、特定の文字列を含む値を持つCookieが検索されます。残念ながら、従来のCookieの文字にはスラッシュが含まれていることがよくあります。私が持っている問題は、Railsアプリケーションがクッキーを書き込むと、まずクッキーの値が間違っているため、レガシーアプリケーションが中断するURLエンコーディングが行われるということです。RailsでクッキーのURLエンコーディングを無効にする方法

私は、このファイル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がスラッシュを含む正しい順序で書き込まれていることを確認する必要があります。誰かがRails 2.3.2でURLエンコーディングを無効にする方法を教えてくれれば大いに感謝します。
ありがとうございます。

答えて

4

掘削をした後、私は自分の質問に対する答えを見つけたので、他の誰かに使用されている場合にはここでそれを文書化しています。 actionpack-2.3.2/libに/ action_controller /ベンダー/ラック1.0 /ラック/ response.rb

:Railsの中でURLエンコードをオフにするために

は、次のファイルを編集する必要がある2.3.2

約70行目に、クッキーのIDと値が設定されています。私は、URLエンコードを有効にするには、以下の変更を加えた:

cookie = Utils.escape(key) + "=" + 
    #value.map { |v| Utils.escape v }.join("&") + 
    value.map { |v| v }.join("&") + 
    "#{domain}#{path}#{expires}#{secure}#{httponly}" 

注:この変更は、標準クッキー影響 - ないバージョン2.3.2でのRailsでセッションデータとして使用するクッキーを。

免責事項:私はこの変更をベストプラクティスとして推奨していません。この変更は、Cookieを特定の形式にする必要があった従来のコード要件を処理する特定の理由でのみ行われました。より良いオプションは、URLエンコーディングを処理するためにレガシーコードを変更することさえあります。残念なことに、そのオプションは私にはわかりませんでしたので、私は根底にあるRailsコードをハックすることを余儀なくされました。これは私が一般的に推奨するものではありません。もちろん、このタイプの変更を行うと、Railsのインストールをアップグレードするたびに、根本的なコードが変更される可能性があるため、問題を再解決する必要があるというリスクはありません。それは実際に私の場合に起こったことです。もちろん、可能であれば、URLエンコーディングを保持するための良い理由(セキュリティ、標準準拠など)もあります。これを行うには

1

簡単な方法は、あなたが私を救っ、

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

をラック方式を使用している...しかし、私は1つの質問があります。これでどのようにドメインを設定できますか? – Boomerange

+0

@Boomerangeでは、ドメインでCookieを設定する方法を見つけることができますか? –

+0

@AmitkumarJhaこんにちは、私はそれを行うにはjavascriptを使用するだけでした。しかしそれは問題ではありません。それは動作します: 'document.cookie ="#{@ cookieName} =#{@ cookieContent}; domain = domain.com " – Boomerange

関連する問題