ADN Open CIS
Сообщество программистов Autodesk в СНГ

26/12/2017

Предотвращение атак CSRF при входе в систему

Описание на сайте OWASP говорит: «Cross-Site Request Forgery (CSRF) - это атака, которая заставляет конечного пользователя выполнять нежелательные действия в веб-приложении, в котором они в настоящее время аутентифицированы».

Это может произойти при отправке данных на сервер, включая вход в систему. Вот почему все службы предоставляют параметр состояния в их авторизованной конечной точке, например, см. Box:
https://developer.box.com/v2.0/docs/oauth-20

Это описание от сервиса Box того, для чего предназначен параметр состояния : "Произвольная строка по вашему выбору, которая будет включена в ответ на ваше приложение. Может быть включено всё, что может быть полезно для вашего приложения. Box обращает эту информацию обратно в ваше приложение и настоятельно рекомендует включить маркер анти-подделки и подтвердить его в ответе, чтобы предотвратить CSRF атаки на ваших пользователей".

Хотя в документации Forge Authentication API это не описано, в случае нашей авторизованой  конечной точки, кроме того, вы можете добавить параметр состояния, который мы вышлем вам при вызове URL обратного вызова вашего приложения. Таким образом, вы можете убедиться, что вызов вернулся как часть текущего сеанса.

Вы можете выбрать библиотеку, которая, по вашему мнению, лучше всего подходит для создания случайного значения, которое вы можете передать в качестве значения состояния . Вот пример кода на стороне сервера:

Код - JavaScript: [Выделить]
  1. // Вернуть URL аутентификации forge
  2. router.get('/user/authenticate', function (req, res) {
  3.   // Создаем уникальный идентификатор и сохраняем его
  4.   // Здесь мы используем пакет «cryptiles» из npm
  5.   // но может быть что-то еще
  6.   req.session.csrf = cryptiles.randomString(24);
  7.  
  8.   // Перенаправить пользователя на эту страницу
  9.   var url =
  10.     "https://developer.api.autodesk.com" +
  11.     '/authentication/v1/authorize?response_type=code' +
  12.     '&client_id=' + config.credentials.client_id +
  13.     '&redirect_uri=' + config.callbackURL +
  14.     '&state=' + req.session.csrf + // добавляем уникальный код
  15.     '&scope=' + config.scopeInternal.join(" ");
  16.   res.end(url);
  17. });
  18.  
  19. // Ожидаем обратный вызов от Autodesk (oAuth callback)
  20. router.get('/api/forge/callback/oauth', function (req, res) {
  21.   var csrf = req.query.state;
  22.  
  23.   // Проверяем, является ли код до сих пор уникальным
  24.   if (!csrf || csrf !== req.session.csrf) {
  25.     res.status(401).end();
  26.     return;
  27.   }
  28.  
  29.   // и т.д.
  30. });

Источник: https://forge.autodesk.com/blog/getbulkproperties-method

Автор перевода: Дмитрий Емельянов

Обсуждение: http://adn-cis.org/forum/index.php?topic=8224

Опубликовано 26.12.2017
Отредактировано 26.12.2017 в 15:58:12