2013-08-16 4 views
0

Я хочу создать случайный токен для моего пользователя. По причинам UX я хочу сгенерировать этот токен в MyController#new, чтобы показать его в new. Затем мне нужно передать его методу create. Однако я хочу, чтобы пользователь не менял его.Передача маркера безопасно от одного метода контроллера к другому

Я знаю 3 способа сделать это:

  1. передать его как скрытое поле
  2. проходит через сессии
  3. записи его в базу данных, помечается как неполные, а затем установить его завершить в create method

Первые два подхода не являются безопасными, а последний - излишним.

Есть ли способ безопасно передать параметр от new до create метод в контроллере?

+1

Я думаю, что сессия достаточно безопасна. Или вы можете использовать систему кэширования на основе памяти, такую ​​как memcached. Храните токен с идентификатором пользователя, а затем извлеките токен с помощью идентификатора пользователя. – Bigxiang

+0

Танки Bigxiang. Не могли бы вы дать ответ, который подробно описывает ваше решение для Rails 4? У меня очень ограниченное понимание безопасности сеанса в Rails 4. – AdamNYC

+1

Привет, я видел, что Декстер создал ответ, я сейчас ухожу, я рассмотрю вопрос вечером, если у вас все еще будет вопрос. :) – Bigxiang

ответ

2

Сессии в Rails и # и выше очень надежны, потому что они хэшированы. Официальная библиотека говорит, что практически никаких доказательств хэша сеанса не было, поэтому пользователь может удалить этот токен только из браузера, но они не могут изменить его на логически правильное значение.

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

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

Надеюсь, я ответил вам, если есть какие-либо недоразумения.

+0

Я думаю, что это то, что я ищу. Не могли бы вы привести пример того, как я это сделаю? – AdamNYC

+0

Предположим, что у вас есть параметр в переменной как 'pass', теперь вы можете зашифровать его, как этот' Digest :: SHA2.hexdigest (pass) ', и сохранить это также в сеансе. – dirtydexter

+0

с другой стороны означает в другом действии, создайте этот хеш снова из 'pass', и если он будет соответствовать, это означает, что никаких изменений в ваш' pass' или токен не было сделано. – dirtydexter

Смежные вопросы