Оцените Java-выражение, используя Groovy - PullRequest
0 голосов
/ 06 сентября 2018

Мне сложно оценить выражение java с помощью groovy. Ниже мой код, где я должен динамически выдвигать операторы замены и оценивать его. Значение replaceSpecialChars поступает из пользовательского ввода.

ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("groovy");
String text =  "Disa";
System.out.println(text); //1
text = text.replace("s", "");
System.out.println(text); //2
String removeSpecialChars =  ".replace('a','')";
text = text + removeSpecialChars;
System.out.println(text); //3
engine.put("first", text);
System.out.println(engine.eval("first")); //4

4 выхода Sysout -

Disa 
Dia 
Dia.replace('a','')
Dia.replace('a','')

Ожидаемые результаты -

Disa
Dia
Dia.replace('a','')
Di

1 Ответ

0 голосов
/ 06 сентября 2018

Вы должны быть в состоянии сделать что-то вроде этого:

ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("groovy");
removeSpecialChars = ".replace('a','')";
text = "Dia";
engine.put("first", text);
result = engine.eval("first" + removeSpecialChars);
System.out.println(result);

Вызывая engine.put("first", text);, вы создаете переменную first со строкой Dia.replace('a','') в качестве значения. Оценка этой переменной - просто noop, поэтому вы снова получаете то же значение, что и результат.

Вы также можете сократить вышеупомянутое до

result = engine.eval("\"" + text + "\"" + removeSpecialChars);

Попробуйте на glot.io: https://glot.io/snippets/f4jyrbt92h

Однако вы, вероятно, должны быть очень осторожны с теми операциями, которые вы разрешаете, и должны убедиться, что злонамеренный ввод пользователя не испортит всю вашу систему. Например, если пользовательский ввод .replace('a',''); file("C:/Windows/").delete();, это может быть то, что вы не хотите выполнять. В целом, принятие пользовательского ввода для динамического выполнения кода делает вашу систему легкой мишенью для всех видов эксплойтов.

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