Как проверить и очистить HTTP Get с помощью Spring Boot? - PullRequest
0 голосов
/ 01 января 2019

Я продолжаю получать эту досадную ошибку от сканера кода Checkmarx,

Method getTotalValue at line 220 of src\java\com\example\PeopleController.java 
gets user input for the personName element. This element’s value then flows through
the code without being properly sanitized or validated and is eventually 
displayed to the user. This may enable a Cross-Site-Scripting attack. 

Вот мой код.Я думаю, что сделал ВСЕ необходимые проверки.Что еще ???

@Slf4j
@Configuration
@RestController
@Validated 

public class PeopleController {

    @Autowired
    private PeopleRepository peopleRepository; 

    @RequestMapping(value = "/api/getTotalValue/{personName}", method = RequestMethod.GET)
    @ResponseBody
    public Integer getTotalValue(@Size(max = 20, min = 1, message = "person is not found") 
    @PathVariable(value="personName", required=true) String personName) {

        PersonObject po = peopleRepository.findByPersonName(
                            Jsoup.clean(personName, Whitelist.basic()));

        try {
            return po.getTotalValue(); 
            } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }  


@ExceptionHandler
    public String constraintViolationHandler(ConstraintViolationException ex) {
        return ex.getConstraintViolations().iterator().next()
                .getMessage();
    } 

} 

Там должно быть не хватает проверки.Как правильно проверить HTTP GET с помощью Spring Boot

1 Ответ

0 голосов
/ 01 января 2019

Вы должны быть немного осторожны с этими инструментами сканирования, так как иногда эти инструменты сообщают о ложных срабатываниях, а иногда никаких изменений кода не требуется.Я не эксперт по checkmarx, но должен быть уверен, что этот инструмент действительно понимает аннотации проверки bean-компонентов, которые вы используете, и вызов Jsoup.clean(personName, Whitelist.basic()).

Я думаю, что сделал ВСЕ необходимые проверки.Что еще ???

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

Вы используете аннотацию @Size для ограничения размера ввода, но это не гарантирует плохие строки - строки, которые могут вызывать атаки XSS.Затем вы используете вызов Jsoup.clean(personName, Whitelist.basic())), чтобы очистить проверенный ввод этого размера.Поскольку я не уверен, что делает этот вызов, вам нужно убедиться, что новое значение - XSS - Safe.Вы немедленно передаете это значение в вызов БД и затем возвращаете Integer вызывающей / клиентской стороне, поэтому я очень пессимистичен в отношении любой возможности XSS-атаки здесь, но инструмент говорит об этом.

Должно быть, отсутствует проверка.Как правильно проверить HTTP GET с помощью Spring Boot

Как я объяснил ранее, проверка ввода - это термин, обычно используемый для проверки ввода на уровне бизнес-логики, в то время как очистка / очистка ввода связана с безопасностью.В среде Spring Boot это обычно делается с помощью Spring Security APIs и включением фильтров XSS или написанием собственного фильтра XSS и подключением его к вашему приложению.Сначала идет фильтр, а потом ваш контроллер, поэтому ваш контроллер всегда будет иметь очищенное значение, и вы примените бизнес-проверки к этому очищенному значению.

Это ответ на широком уровне и для кода и т. Д. Вы могли бы сделать Google.Также предлагаем прочитать больше о XSS-атаках.Просто поймите, что есть несколько способов достичь одной и той же цели.

3 способа предотвращения XSS

Предотвращение XSS в Java

Как создать фильтр в Spring RESTful дляПредотвратить XSS?

Учебное пособие по межсайтовому скриптингу (XSS) с примерами, типами и предотвращением

В последней упомянутой ссылке,

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

и что вы не делаете в своем коде, так что я бы предположил, что естьнет XSS.

РЕДАКТИРОВАТЬ:

Существует два аспекта безопасности XSS - во-первых, запрещение злонамеренного ввода кода на стороне сервера и это было бы сделано с использованием фильтра XSS & Иногда,нет ничего плохого в том, чтобы разрешить злонамеренный ввод (допустим, вы сохраняете этот злонамеренный ввод в БД или возвращаетесь в ответе API).

Второй аспект - информирование клиентов HTML о возможных атаках XSS (если мы точно знаем, что клиент API будет HTML / UI), тогда нам нужно добавить заголовок X-XSS-Protection, что будет сделано с помощью приведенного ниже кода.,Это позволит браузеру включить функцию защиты XSS (если имеется).

@ Переопределить защищенный void configure (HttpSecurity http) выдает исключение {

http.headers().xssProtection()....

}

Что такое http-заголовок «X-XSS-Protection»?

Включена ли защита Xss в безопасности Spring по умолчанию?

Первый аспект, т. Е. Фильтр записи, см. my this answer иссылки в этом ответе.

Я думаю, что я неправильно написал выше, что Spring Security предоставляет фильтры для очистки входных данных, я думаю, это не так.Проверим и сообщу.Я написал свой пользовательский фильтр в строках, упомянутых в ответе на этот вопрос - Запрет XSS в контроллере Spring MVC

Вы также должны понимать, что Spring Boot тоже привык к написанию традиционных приложений MVCгде сторона сервера представляет HTML для рендеринга тоже.В случае ответов JSON (API-интерфейсы REST) ​​клиент UI может контролировать то, что следует избегать, а что нет, сложность возникает из-за того, что выходные данные JSON не всегда передаются клиентам HTML, то есть браузерам.

...