Как отключить URL-кодирование файлов cookie в Rails

У меня есть приложение Rails, которое должно сосуществовать с очень старым устаревшим приложением. Устаревшее приложение ищет файл cookie, значение которого содержит определенную строку символов. К сожалению, символы в устаревших файлах cookie часто содержат косую черту. У меня проблема в том, что когда приложение Rails записывает файл cookie, оно сначала выполняет кодирование URL, что приводит к поломке устаревшего приложения из-за неправильного значения cookie.

У меня это работало в Rails 1.13.5, редактируя файл cookie_performance_fix.rb (Path: ./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 продолжает кодироваться в URL-адресе в новом Rails 2.3.2. Я знаю, что отключение URL-кодирования - не лучшая идея, но у меня нет особого выбора, пока устаревшее приложение не будет удалено. К сожалению, у меня нет доступа к устаревшему коду для добавления поддержки URL-декодирования файла cookie, поэтому я должен убедиться, что устаревший файл cookie записан с правильной последовательностью, включая косые черты. Если кто-нибудь может сказать мне, как отключить кодирование URL-адресов в Rails 2.3.2, я был бы очень признателен.
Спасибо.


person awake2night    schedule 07.07.2009    source источник


Ответы (2)


Покопавшись, я нашел ответ на свой вопрос и документирую его здесь на случай, если он пригодится кому-то еще.

Чтобы отключить URL-кодировку в Rails 2.3.2, необходимо отредактировать следующий файл: actionpack-2.3.2 / lib / action_controller / vendor / rack-1.0 / rack / response.rb

Примерно в строке 70 устанавливается идентификатор и значение cookie. Я сделал следующее изменение для включения кодировки URL:

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

ПРИМЕЧАНИЕ. Эта модификация затрагивает только стандартные файлы cookie, но не файлы cookie, используемые Rails в качестве данных сеанса в версии 2.3.2.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я никоим образом не рекомендую это изменение как лучшую практику. Эта модификация была сделана только для конкретной цели обработки требований устаревшего кода, которые требовали, чтобы cookie был в определенном формате. Лучшим вариантом было бы даже изменить устаревший код для обработки URL-кодирования. К сожалению, этот вариант был для меня закрыт, поэтому я был вынужден взломать базовый код Rails, что я обычно не рекомендую. Конечно, само собой разумеется, что внесение этого типа модификации сопряжено с риском того, что проблему придется повторно решать каждый раз, когда вы обновляете установку Rails, поскольку основной код может измениться. Именно это и произошло в моем случае. И, конечно, также, вероятно, есть веские причины (безопасность, соответствие стандартам и т. Д.) Для сохранения URL-кодировки, если это вообще возможно.

person awake2night    schedule 15.07.2009

Простой способ сделать это - использовать метод стойки,

response["set-cookie"]="id_cookie=this cookie will be not escaped"
person user348163    schedule 24.12.2011
comment
Ты спас меня ... Но у меня один вопрос. Как я могу установить домен с этим? - person Boomerange; 23.01.2017
comment
@Boomerange вы можете найти, как мы можем установить cookie с доменом? - person Amitkumar Jha; 28.04.2017
comment
@AmitkumarJha Привет, мне удалось это сделать только с помощью javascript. Но это не важно. Работает: document.cookie = "#{@cookieName}=#{@cookieContent};domain=domain.com" - person Boomerange; 01.05.2017
comment
Это почти правильный ответ. Заголовки HTTP должны начинаться с заглавных букв. Установка cookie как set-cookie работает до тех пор, пока в стеке нет другого компонента, устанавливающего cookie с более правильным заголовком Set-Cookie. Например, если вы используете devise для аутентификации, devise переопределит ваш ручной файл cookie, поскольку он использует заголовок Set-Cookie. Браузеры будут рассматривать только первое и отбрасывать другие. - person Samuel Brandão; 06.03.2018