Rails запрашивает настройки защиты от подделки - PullRequest
4 голосов
/ 28 апреля 2010

пожалуйста, помогите новичку в 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 / средах / development.rb

config.action_controller.consider_all_requests_local = true

Из-за среды DEV и локальных запросов эти пост-запросы jQuery были в порядке.

Ответы [ 2 ]

2 голосов
/ 28 апреля 2010

В вашем коде нет ничего плохого, если запрос $.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. Если вы это сделаете, то есть что-то подозрительное.

0 голосов
/ 28 апреля 2010

Глупый вопрос, возможно: Вы уверены, что подклассифицируете ApplicationController? Как выглядит ваша карта маршрутов? А какая версия Rails (просто для наглядности)?

Вы убедились, что вызов из jQuery на самом деле является POST, а не GET? (Я знаю, это кажется очевидным). Rails будет выполнять защиту только по не-GET запросам.

Кроме того, каков тип содержимого запроса, который выходит. Rails также будет выполнять защиту только в соответствии с документами , если это запрос HTML / Javascript.

...