Рубрики
Без рубрики

Защита CSRF с пружинным MVC и Thymeleaf

Краткое и практическое руководство по предотвращению CSRF-атак с помощью Spring Security, Spring MVC и Thymeleaf.

Автор оригинала: baeldung.

1. введение

Thymeleaf – это движок шаблонов Java для обработки и создания HTML, XML, JavaScript, CSS и обычного текста. Для введения в Thymeleaf и Spring взгляните на эту запись .

В этой статье мы обсудим, как предотвратить атаки на подделку межсайтовых запросов (CSRF) в Spring MVC с помощью приложения Thymeleaf. Чтобы быть более конкретным, мы протестируем атаку CSRF для метода HTTP POST.

CSRF-это атака, которая заставляет конечного пользователя выполнять нежелательные действия в веб-приложении, в котором в данный момент аутентифицируется.

2. Зависимости Maven

Во-первых, давайте рассмотрим конфигурации, необходимые для интеграции Thymeleaf с Spring. В наших зависимостях требуется библиотека thymeleaf-spring :


    org.thymeleaf
    thymeleaf
    3.0.11.RELEASE


    org.thymeleaf
    thymeleaf-spring5
    3.0.11.RELEASE

Обратите внимание, что для проекта Spring 4 библиотека thymeleaf-spring4 должна использоваться вместо thymeleaf-spring 5 . Последнюю версию зависимостей можно найти здесь .

Кроме того, чтобы использовать Spring Security, нам необходимо добавить следующие зависимости:


    org.springframework.security
    spring-security-web
    5.2.3.RELEASE


    org.springframework.security
    spring-security-config
    5.2.3.RELEASE

Последние версии двух библиотек, связанных с безопасностью Spring, доступны здесь и здесь .

3. Конфигурация Java

В дополнение к конфигурации Thymeleaf , описанной здесь, нам нужно добавить конфигурацию для безопасности Spring. Для этого нам нужно создать класс:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class WebMVCSecurity extends WebSecurityConfigurerAdapter {

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
          .withUser("user1").password("{noop}user1Pass")
          .authorities("ROLE_USER");
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/resources/**");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
          .authorizeRequests()
          .anyRequest()
          .authenticated()
          .and()
          .httpBasic();
    }
}

Для получения более подробной информации и описания конфигурации безопасности мы обратимся к серии Security with Spring.

Защита CSRF включена по умолчанию в конфигурации Java. Чтобы отключить эту полезную функцию, нам нужно добавить это в configure(…) метод:

.csrf().disable()

В конфигурации XML нам нужно указать защиту CSRF вручную, иначе она не будет работать:


    
     
    

Пожалуйста, также обратите внимание, что если мы используем страницу входа в систему с формой входа в систему, нам нужно всегда включать токен CSRF в форму входа в систему в качестве скрытого параметра вручную в коде:

Для остальных форм токен CSRF будет автоматически добавлен в формы со скрытым вводом:

 

4. Конфигурация представлений

Перейдем к основной части HTML – файлов с действиями над формой и созданием процедуры тестирования. В первом представлении мы пытаемся добавить нового ученика в список:





Add Student


    

Add Student

В этом представлении мы добавляем студента в список, указав id , имя , пол и процент (необязательно, как указано в проверке формы). Прежде чем мы сможем выполнить эту форму, нам необходимо указать пользователя и пароль , чтобы аутентифицировать нас в веб-приложении.

4.1. Тестирование CSRF-атак браузера

Теперь перейдем ко второму представлению HTML. Цель его состоит в том, чтобы попытаться выполнить атаку CSRF:





    


Мы знаем, что URL-адрес действия http://localhost:8080/spring-thymeleaf/saveStudent . Хакер хочет получить доступ к этой странице, чтобы выполнить атаку.

Для тестирования откройте HTML-файл в другом браузере, не входя в приложение. Когда вы попытаетесь отправить форму, мы получим страницу:

Наш запрос был отклонен, потому что мы отправили запрос без маркера CSRF.

Обратите внимание, что HTTP-сессия используется для хранения токена CSRF. Когда запрос отправляется, Spring сравнивает сгенерированный токен с токеном, хранящимся в сеансе, чтобы подтвердить, что пользователь не взломан.

4.2. Тестирование CSRF-атак JUnit

Если вы не хотите тестировать CSRF-атаку с помощью браузера, вы также можете сделать это с помощью быстрого интеграционного теста; давайте начнем с конфигурации Spring для этого теста:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = { 
  WebApp.class, WebMVCConfig.class, WebMVCSecurity.class, InitSecurity.class })
public class CsrfEnabledIntegrationTest {

    // configuration

}

И переходите к реальным тестам:

@Test
public void addStudentWithoutCSRF() throws Exception {
    mockMvc.perform(post("/saveStudent").contentType(MediaType.APPLICATION_JSON)
      .param("id", "1234567").param("name", "Joe").param("gender", "M")
      .with(testUser())).andExpect(status().isForbidden());
}

@Test
public void addStudentWithCSRF() throws Exception {
    mockMvc.perform(post("/saveStudent").contentType(MediaType.APPLICATION_JSON)
      .param("id", "1234567").param("name", "Joe").param("gender", "M")
      .with(testUser()).with(csrf())).andExpect(status().isOk());
}

Первый тест приведет к запретному статусу из-за отсутствия токена CSRF, в то время как второй будет выполнен должным образом.

5. Заключение

В этой статье мы обсудили, как предотвратить атаки CSRF с помощью Spring Security и Thymeleaf framework.

Полную реализацию этого руководства можно найти в проекте GitHub .