Как я могу заставить Синатру использовать токены подлинности CSRF?
Я создаю простое приложение в рубине, используя инфраструктуру Sinatra. В основном это "получить" - большинство запросов будет заключаться в перечислении данных. Однако в приложении есть несколько ключевых экранов, которые будут собирать пользовательский ввод. Я хочу, чтобы приложение было так же безопасно, как я могу это сделать, и в настоящее время пытаюсь найти, как реализовать токены аутентификации, которые вы получаете в форме Rails?
Где я должен:
Ну, я знаю, что мне нужны токены для csrf, но я не уверен, что мне нужно сгенерировать их самостоятельно или Sinatra может сделать это для меня - я просмотрел документы, и они говорят, что Sinatra использует Rack Protection, однако, Я не могу найти для него какой-либо примерный код и не могу понять, как это сделать - любая помощь, созданная - спасибо!
Ответы
Ответ 1
Используйте rack_csrf
драгоценный камень. Установите его с помощью
gem install rack_csrf
В камне rack_csrf
есть пример Sinatra. Ниже приведен более простой пример, адаптированный из этой страницы (кажется офлайн. Архивная версия):
require "rack/csrf"
configure do
use Rack::Session::Cookie, :secret => "some unique secret string here"
use Rack::Csrf, :raise => true
end
Использование enable :sessions
вместо use Rack::Session::Cookie ...
также будет работать в большинстве случаев (см. комментарий к комментарию).
По вашему мнению, вы можете получить токен (или тег) с помощью методов Rack::Csrf.csrf_token
и Rack::Csrf.csrf_tag
. Если это кажется длинным, вы можете определить помощник по строкам:
helpers do
def csrf_token
Rack::Csrf.csrf_token(env)
end
def csrf_tag
Rack::Csrf.csrf_tag(env)
end
end
Небольшой пример с использованием вспомогательного метода:
<form method="post" action="/tweet">
<%= csrf_tag %>
<input type="text" name="message"/>
<input type="submit" value="Submit a tweet!"/>
</form>
Ответ 2
Когда отображается тот же самый вид erb, в случае, когда учетные данные недействительны при входе в систему. Теперь, после рендеринга при отправке, выдается ошибка. Rack::Csrf::InvalidCsrfToken at/login
Rack::Csrf::InvalidCsrfToken
Нужно ли делать перенаправление вместо рендера, чтобы сделать эту работу? потому что при рендеринге старый токен csrf остается на месте. при полном перенаправлении у нас генерируется новый токен.