Подтвердить что ты не робот

Как я могу заставить Синатру использовать токены подлинности CSRF?

Я создаю простое приложение в рубине, используя инфраструктуру Sinatra. В основном это "получить" - большинство запросов будет заключаться в перечислении данных. Однако в приложении есть несколько ключевых экранов, которые будут собирать пользовательский ввод. Я хочу, чтобы приложение было так же безопасно, как я могу это сделать, и в настоящее время пытаюсь найти, как реализовать токены аутентификации, которые вы получаете в форме Rails?

Где я должен: Ну, я знаю, что мне нужны токены для csrf, но я не уверен, что мне нужно сгенерировать их самостоятельно или Sinatra может сделать это для меня - я просмотрел документы, и они говорят, что Sinatra использует Rack Protection, однако, Я не могу найти для него какой-либо примерный код и не могу понять, как это сделать - любая помощь, созданная - спасибо!

4b9b3361

Ответ 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 остается на месте. при полном перенаправлении у нас генерируется новый токен.