Защита CSRF при переходе с Rails 3 на Rails 4 - PullRequest
0 голосов
/ 13 ноября 2018

Я работаю над переносом большого пакета веб-сайтов с Ruby 1.9 на Ruby 2.3, и я почти закончил.У меня Rails почти полностью перешел с 3.2 на 4.2, но я столкнулся с одной загадкой, которую я не могу понять, и этот проект - мой первый опыт работы с Ruby или Rails, поэтому я выбрал жаргон какЯ пойду.

Когда я указываю свой браузер на свой сервер разработки, все мои запросы GET выполняются успешно (200), но все мои запросы POST терпят неудачу (500).После некоторых исследований я узнал о встроенной в Rails защите CSRF и смог определить, что пакет, с которым я работаю, имеет эту защиту, когда он использует Rails 3.2.

С Rails 4.2на месте защита, по-видимому, препятствует выполнению любых запросов POST.После более подробного изучения я обнаружил, что Rails 4 шифрует куки-файлы аутентификации перед отправкой их на веб-сервер, а Rails 3 - нет, и что рекомендуется использовать куки-файлы Rails 3, пока все ваши пользователи не перейдут на Rails 4. Язакомментировал определение secret_key_base, которое я создал как часть миграции, и я очистил кеш браузера, так что, насколько я понимаю, теперь я должен использовать незашифрованный cookie Rails 3.

Однако мои запросы POSTдо сих пор бросают 500 с.Я не могу поделиться большим количеством кода, но я сослался на это официальное руководство , и у меня есть эта строка в контроллере приложения:

protect_from_forgery with: :exception

Я также подтвердил, что если я буду комментироватьЗащитите и используйте:

skip_before_action :verify_authenticity_token

, тогда POST-запросы будут успешными (они просто очень небезопасны).

Большая часть того, что я прочитал, указывает на то, что эта функция зависит отСтрока protect_from_forgery, которую я показал выше, и все.

Мне кажется, что эти запросы не могут быть выполнены успешно, и мне интересно, если это просто еще один уровень знаний, который я еще не получил.Буду очень признателен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

У вас есть файл config/secrets.yml?Это должно выглядеть примерно так:

development:
  secret_key_base: a75d...

test:
  secret_key_base: 492f...

production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

И если это так, вам нужно убедиться, что на вашем сервере установлена ​​переменная окружения.С ключами нужно обращаться осторожно и НИКОГДА не связываться с публичным репо, т.е. GIT.

См. https://guides.rubyonrails.org/v4.2/security.html

0 голосов
/ 13 ноября 2018

Макет вашего приложения, вероятно, app/views/layouts/applications.html.erb должен ссылаться на <%= csrf_meta_tags %>

Это то, что включено и проверено во всех сообщениях формы.

Если вы не используете этот макет ввсе ваши взгляды, вам нужно найти другой способ убедиться, что на него ссылаются везде.

Документы

...