Как предотвратить CSRF в игре [2.0] с помощью Scala? - PullRequest
17 голосов
/ 30 марта 2012

Многие веб-фреймворки имеют стандартную настройку для генерации форм с токенами авторизации.

Нужно ли создавать такие меры вручную или Play поставляется со встроенным средством предотвращения CSRF?

Документация на сайте Play , похоже, не решает эту проблему.

Ответы [ 3 ]

11 голосов
/ 30 марта 2012

Я использую модуль play2-authenticitytoken :

Маркер подлинности - это способ обойти одну из самых серьезных угроз безопасности в Интернете: атаки CRSF.Это гарантирует, что клиент, отправляющий форму, - это тот, кто получил страницу (а не хакер, который украл ваши данные сеанса).

Как это работает:

Вв двух словах:

  1. в каждом сообщении формы мы добавляем скрытый параметр, содержащий uuid
  2. , когда uuid подписан, а его подпись сохраняется в сеансе (который переводится в cookie)

Когда пользователь отправляет форму, мы получаем: uuid, подпись и другие данные формы.

  1. Мы снова подписываем входящий uuid
  2. Проверка проходит, если подписи совпадают (session.sign = uuid.sign)

Если злоумышленник введет другой идентификатор, он никогда не поймет, как создать правильную подпись.

8 голосов
/ 23 апреля 2013

Начиная с Play 2.1, в фреймворке это поддерживается. Ник Кэрролл написал небольшую статью о том, как его использовать:

http://nickcarroll.me/2013/02/11/protect-your-play-application-with-the-csrf-filter/

8 голосов
/ 31 марта 2012

Для полноты изложения у меня есть пример в Scala для Play 2.0

.

Этот метод также использует подход cookie + скрытое поле.

Пример использования

Используйте действие SessionKey, чтобы помочь подписать форму:

object Application extends Controller {
    def login = SessionKey{ (key,signature) => 
        Action { implicit request =>
            Ok( views.html.login(signature) ).withSession( key->signature )
        }
    }
}

При анализе форм используйте следующее для проверки подписи:

object Authenticator extends Controller {
    def login = ValidateForm{ 
        Action { implicit request =>
            Ok( views.html.index("You're Loggd In") )
        }
    }   
}
...