Я написал специальный валидатор ограничения параметров запроса, показанный ниже.
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' недействительно"
Похоже, код в параметре запроса выполняется на уровне кода.
Как мы можем обнаружить, что это код, или предотвратить его выполнение?