protect_from_forgery vs. Firefox - PullRequest
       12

protect_from_forgery vs. Firefox

2 голосов
/ 30 января 2009

Я недавно перешел от хранения данных сеанса в cookie-файле к хранению их в базе данных.

Теперь каждый запрос POST вызывает ошибку ActionController :: InvalidAuthenticityToken . Это происходит только в Firefox и только на моей домашней машине (сегодня я попробовал это на работе в той же версии FF, и все было хорошо). Это заставляет меня поверить, что это как-то связано с cookie, который я удалил вчера ...

Вот соответствующая часть environment.rb:

# Your secret key for verifying cookie session data integrity.
# If you change this key, all old sessions will become invalid!
# Make sure the secret is at least 30 characters and all random, 
# no regular words or you'll be exposed to dictionary attacks.
config.action_controller.session = {
:session_key => '_basillslam_session',
:secret      => '373ee5b69a4a31d3318485fs368c41fac6b797a1f5c35693b49bd34e8a96291b92dd577bd49de7aeea56c9ffa1af2d8386bafe857220cafacfa0028f01be357d78'
}

# Use the database for sessions instead of the cookie-based default,
# which shouldn't be used to store highly confidential information
# (create the session table with 'rake db:sessions:create')
config.action_controller.session_store = :active_record_store

В приложении. Rb:

protect_from_forgery :secret => 'f1d54db45b47ec94a6a54b1e744fafa6'

Вот часть полной трассировки, в которой выдается ошибка:

C:/INSTAN~1/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/request_forgery_protection.rb:79:in `verify_authenticity_token'
C:/INSTAN~1/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/filters.rb:469:in `send!'
C:/INSTAN~1/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/filters.rb:469:in `call'
C:/INSTAN~1/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/filters.rb:441:in `run'
C:/INSTAN~1/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/filters.rb:716:in `run_before_filters'
C:/INSTAN~1/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/filters.rb:695:in `call_filters'
C:/INSTAN~1/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/filters.rb:689:in `perform_action_without_benchmark'
C:/INSTAN~1/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue'
C:/INSTAN~1/ruby/lib/ruby/1.8/benchmark.rb:293:in `measure'
C:/INSTAN~1/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue'
C:/INSTAN~1/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/rescue.rb:199:in `perform_action_without_caching'
C:/INSTAN~1/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/caching.rb:678:in `perform_action'
C:/INSTAN~1/ruby/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/connection_adapters/abstract/query_cache.rb:33:in `cache'
C:/INSTAN~1/ruby/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/query_cache.rb:8:in `cache'
[etc. ... ]

Кто-нибудь испытывал это раньше? Или кто-нибудь знает, почему это может происходить?

Ответы [ 3 ]

3 голосов
/ 30 января 2009

Точно то же самое случилось со мной, когда я переключил один из моих сайтов. Удалите cookie сессии Rails для этого сайта в вашем домашнем браузере Firefox.

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

С сеансом в базе данных и только случайным ключом для сопоставления с этим сеансом в файлах cookie браузера, волшебство защиты сеанса больше не требуется.

1 голос
/ 24 февраля 2012

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

config.action_controller.session[:session_key]
1 голос
/ 30 января 2009

Благодаря Отто я теперь знаю причину, по которой это происходит. Хотя я смог обойти эту проблему, написав <%= token_tag %> в форме, которую отправляют. token_tag помещает скрытое поле, содержащее маркер подлинности в форме, и, следовательно, ошибка ActionController :: InvalidAuthenticityToken исчезает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...