При загрузке страницы swagger-ui.html делается запрос на хост: порт / и хост: порт / csfr - PullRequest
4 голосов
/ 09 апреля 2019

У меня есть приложение Spring boot 2 (rest API) и я использую библиотеку Springfox Swagger 2, включая библиотеку пользовательского интерфейса. Когда я открываю интерфейс swagger, найденный в http://localhost:8080/swagger-ui.html, все работает как положено, но делаются два запроса, которые дают результат 404 в логгере:

http://localhost:8080/ (ничего не отображается в корне моего приложения)
http://localhost:8080/csfr (это отображение также не существует, но я знаю, что оно стоит для «подделанного межсайтового запроса»)

Очевидно, что Swagger делает это, потому что он «поддерживает» какую-то проверку токена csfr, как объяснено 1014 *. В течение нескольких месяцев ведется расследование, можно ли настроить эти 404 вызовы, поэтому я сейчас размышляю над внедрением конечной точки. Я не могу найти информацию о том, что на самом деле реализовать. Какой заголовок / токен ожидает чванство, и что он будет делать с информацией в нем? Могу ли я использовать это, чтобы сделать мое приложение (или конечную точку чванства) более безопасным или доступным? Короче: в чем смысл:)?

1 Ответ

5 голосов
/ 05 июня 2019

Позвольте мне ответить на ваши вопросы один за другим.

Почему запрос сделан на http://localhost:8080/ и http://localhost:8080/csrf

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

  • CSRF-токен в ваших метатегах, обслуживаемых по адресу /
  • Конечная точка /csrf
  • CSRF-токен в вашем cookie

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

Какой заголовок / токен ожидает чванство, и что он будет делать с информацией в нем?

Как я уже говорил ранее, swagger ожидает токен CSRF и присоединит его к заголовку запроса при попытке доступа к любым конечным точкам swagger.

Могу ли я использовать это, чтобы сделать мое приложение (или конечную точку чванства) более безопасным или доступным?

Включение защиты CSRF в вашем приложении сделает ваше приложение защищенным от CSRF-атак и необязательно просто , предоставив маркер CSRF для swagger для присоединения к заголовку. Если вы включили защиту CSRF в своем приложении, вы должны предоставить токен CSRF любым из вышеперечисленных 3 способов для доступа к любым конечным точкам сваггера в вашем приложении. Вы можете прочитать об использовании включения защиты от CSRF здесь .

Я не могу найти информацию о том, что на самом деле реализовать

Нет никакого смысла в реализации предоставления токена CSRF для swagger, если вы не включили защиту CSRF в своем приложении, так как это было бы просто избыточно. Но если вы хотите реализовать предоставление токена CSRF для swagger, вы можете сделать это одним из 3 способов ниже:

1) CSRF-токен в ваших метатегах, обслуживаемый по адресу /

<html>
<head>
  <meta name="_csrf" content="${_csrf.token}"/>
  <!-- default header name is X-CSRF-TOKEN -->
  <meta name="_csrf_header" content="${_csrf.headerName}"/>
</head>

Это в случае, если вы используете какой-либо шаблонный механизм, такой как JSP, тимелист и т. Д.

2) Конечная точка /csrf

Определите конечную точку /csrf для предоставления токена CSRF.

  @RequestMapping("/csrf")
  public CsrfToken csrf() {
    //logic to return the CSRF token
  }

3) CSRF-токен в вашем cookie

По умолчанию ищется имя файла cookie XSRF-TOKEN, а возвращаемое имя заголовка по умолчанию X-XSRF-TOKEN. Spring security предоставляет способ хранения токена CSRF в файле cookie, как того требует swagger, с конфигурацией ниже

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
    }
}

Реализация любого из вышеперечисленных 3 обеспечит swagger токеном CSRF для присоединения к заголовку запроса.

Ссылка на вышесказанное взята из GitHub PR , который предоставил поддержку CSRF для Springfox swagger, а также документации по безопасности Spring, которую я связал ранее.

В настоящее время существует открытая проблема, касающаяся поддержки CSRF по умолчанию здесь и нескольких открытых PR с исправлением # 2639 и # 2706 .

...