Валидатор Java Custom Constraint, выполняющий вредоносный код в параметрах запроса - PullRequest
0 голосов
/ 15 ноября 2018

Я написал специальный валидатор ограничения параметров запроса, показанный ниже.

import org.apache.commons.lang3.StringUtils;

import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * OrderByParam
 * Custom annotation to validate orderBy query parameter
 * Stackoverflow reference: http://www.makeinjava.com/jersey-bean-validation-rest-request-query-parameters-using-custom-annotation-example-ii/
 */

@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = OrderByParam.Validator.class)
public @interface OrderByParam {

    String message() default "Invalid orderBy parameter";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    public class Validator implements ConstraintValidator<OrderByParam, String> {

        @Override
        public boolean isValid(final String orderByParam, ConstraintValidatorContext context) {
            String orderBy = orderByParam;
            // remove - prefix if present
            if (orderByParam.startsWith("-")) {
                orderBy = StringUtils.removeStart(orderByParam, "-");
            }

            switch (orderBy) {
                case "date":
                    return true;
                default:
                    String err = String.format("'%s' is not valid", orderBy);
                    context.disableDefaultConstraintViolation();
                    context
                        .buildConstraintViolationWithTemplate(err)
                        .addConstraintViolation();

                    return false;
            }
        }
    }
}

Однако, когда я передаю параметр запроса, подобный этому

$%7b'TEST'.toLowerCase()%7d

Код будет выполнен в строке и пользовательское сообщение будет выглядеть как

{ «причина»: «Плохой запрос», "сообщение": "тест" недействителен " }

Правильное сообщение должно быть

"'$% 7b'TEST'.toLowerCase ()% 7d' недействительно"

Похоже, код в параметре запроса выполняется на уровне кода.

Как мы можем обнаружить, что это код, или предотвратить его выполнение?

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