Является ли ServletRequest :: setAttribute безопасным с точки зрения безопасности веб-службы? - PullRequest
0 голосов
/ 22 февраля 2019

Короткая версия

Метод javax.servlet.ServletRequest setAttribute(<key>, <Object>) используется только как средство передачи объектов между методами в коде Java?

Длинная версия

Давайтескажем, у меня есть javax.servlet.Filter реализация для обработки аутентификации всех вошедших в систему пользователей с помощью куки:

в Spring Boot

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class AuthFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        Cookie[] cookies = null;
        if (request instanceof HttpServletRequest) {
            cookies = ((HttpServletRequest) request).getCookies();
        }

        Optional<User> user = mySessionAuthMethod(cookies);
        if (user.isPresent()) {
            request.setAttribute("user", user.get());
        }

        chain.doFilter(request, response);
    }
}

Тогда позже я могу избежать ручногопроверка подлинности во всех методах Web API и просто проверьте атрибут user.Пример использования метода @RestController:

@RequestMapping(value = "/profile")
@CrossOrigin(origins = {MyProperties.ORIGIN}, allowCredentials = "true")
public ResponseEntity getProfile(HttpServletRequest request, HttpServletResponse response) {
    String user = request.getAttribute("user");
    if (user != null) {
        return myGetProfileResponse(user);
    }
    return myNotLoggedInResponse();
}

Мои вопросы:

  • Безопасна ли эта форма аутентификации? Что язначит, атрибуты в ServletRequest только добавляются и используются в Java для связи между методами, или они могут быть добавлены к запросу уже до достижения сервера?

  • Является ли этот способ аутентификации с использованием Filter хорошей практикой, чтобы избежать дублирования кода?

Дополнительное объяснение

Настоящая причина этого не только аутентификация.У меня также есть Filter s, которые должны обрабатывать каждый запрос и передавать объекты в Controller s.Я определенно хочу, чтобы ни один из этих объектов и информации не мог быть подделан даже человеком, который знает реализацию системы.

1 Ответ

0 голосов
/ 22 февраля 2019

Я думаю, что нашел ответ из документации getAttribute

Атрибуты могут быть установлены двумя способами.Контейнер сервлета может устанавливать атрибуты, чтобы сделать доступной пользовательскую информацию о запросе.Например, для запросов, сделанных с использованием HTTPS, атрибут javax.servlet.request.X509Certificate можно использовать для получения информации о сертификате клиента.Атрибуты также могут быть установлены программно с помощью ServletRequest#setAttribute.Это позволяет встраивать информацию в запрос перед вызовом RequestDispatcher.

Таким образом, в соответствии с этим (если отсутствует недостающая информация), должно быть абсолютно безопасно передавать пользовательские объекты и знать, чтоони всегда создавались сервером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...