Rails запрашивает настройки защиты от подделки
Помогите пожалуйста новичку в Rails:) у меня есть protect_from_forgery
вызов (который предоставляется по умолчанию) без атрибутов в моем ApplicationController
учебный класс.
В основном вот код:
class ApplicationController < ActionController::Base
helper :all # include all helpers, all the time
protect_from_forgery
helper_method :current_user_session, :current_user
filter_parameter_logging :password, :password_confirmation
Я предполагаю, что это должно сделать: это должно предотвратить любые запросы POST без правильного authenticity_token
, Но когда я отправляю пост-запрос с помощью jQuery, как показано ниже, он работает нормально (в базе данных выполняется оператор обновления)!
$.post($(this).attr("href"), { _method: "PUT", data: { test: true } });
Я вижу в консоли, что нет authenticity_token
среди отправленных параметров, но запрос все еще считается действительным. Это почему?
UPD Найден параметр конфигурации в config/environment /development.rb
config.action_controller.consider_all_requests_local = true
Из-за среды DEV и локальных запросов эти почтовые запросы jQuery были в порядке.
2 ответа
Там нет ничего плохого в вашем коде, пока запрос $.post($(this).attr("href"), { _method: "PUT", data: { test: true } });
выполняется из самого приложения. Если у вас было другое приложение, запущенное в другом месте, например, на localhost:3001, и вы отправили сообщение оттуда, то оно не будет работать. На самом деле, если вы используете Firefox > 3.0, он также имеет раннюю реализацию межсайтового xhr. Например, вы можете отправить сообщение POST с любого другого сайта (но это работает при условии, что protect_from_forgery отключен!). Причина, по которой аутентификационный токен не нужен для xhr, заключается в том, что межсайтовый xhr отключен. Поэтому безопасно использовать xhr без предоставления токена авторизации. Если вы попробуете из любого другого места, кроме вашего приложения, я уверен, что оно вызовет исключение, запрашивающее токен авторизации. Также вы должны иметь файл crossdomain.xml, определенный для предотвращения доступа из внешних источников.
Попробуйте сделать это: curl -X -d url_endpoint_of_your_app
, Посмотрите, получите ли вы код ответа 200. Если вы делаете, то есть что-то подозрительное.
Глупый вопрос, возможно: Вы уверены, что подклассифицируете ApplicationController? Как выглядит ваша карта маршрутов? А какая версия Rails (просто для наглядности)?
Вы убедились, что вызов из jQuery на самом деле является POST, а не GET? (Я знаю, это кажется очевидным). Rails будет выполнять защиту только по не-GET запросам.
Кроме того, каков тип содержимого запроса, который выходит. Rails также будет выполнять защиту только в соответствии с документацией, если это запрос HTML/Javascript.