Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Вычисление математических выражений из String


Автор: firedrago 16.11.2011, 12:09
Всем привет!
Есть ли вариант как сделать это красивее,  или это самая нормальная и быстрая возможность ?
Код

import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;

public class Test {
    public static void main(String[] args) throws Exception {
        ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine engine = mgr.getEngineByName("JavaScript");
        String foo = "(12+(5+2))*(6+3)";
        System.out.println(engine.eval(foo));
    }
}




Автор: priam220 16.11.2011, 17:39
Само появление такой необходимости кажется странным.

Автор: firedrago 16.11.2011, 18:41
Цитата(priam220 @  16.11.2011,  17:39 Найти цитируемый пост)
Само появление такой необходимости кажется странным. 

Необходимость появляется тогда, когда юзер сам задает формулу для вычислений, с константами, скобками и т.д. или есть лучшее решение?

Автор: Skynin 16.11.2011, 20:35
Цитата

Необходимость появляется тогда, когда юзер сам задает формулу для вычислений, с константами, скобками и т.д. или есть лучшее решение?

Вполне сгодится, как быстрая возможность. 
Собственно понятие скрипта то и подразумевает - дать пользователю возможность самому вводить, или изменять какие-то алгоритмы в программе.

Вопрос правда о безопасности, если пользователь хакер, то ввести может не только мат формулу smile
Так что нужно бы как-то верифицировать вводимое на предмет допустимости операций.

Автор: Stolzen 17.11.2011, 09:34
А что пользователь может ввести в данном случае, чтобы похакать программу?

Автор: firedrago 17.11.2011, 10:24
Цитата(Skynin @  16.11.2011,  20:35 Найти цитируемый пост)

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

 smile это я и хотел услышать, я тоже так думаю, в любом случае похоже на то, что это лучшее решение....


Цитата(Skynin @  16.11.2011,  20:35 Найти цитируемый пост)
Вопрос правда о безопасности, если пользователь хакер, то ввести может не только мат формулу

в моем случае, это не актуально...


Цитата(Stolzen @  17.11.2011,  09:34 Найти цитируемый пост)
А что пользователь может ввести в данном случае, чтобы похакать программу?

теоретически - любой код, любой длины на JS (хотя я думаю, что скорее всего ничего ужастного сделать не получится), практически - надо разбераться....

Автор: Skynin 17.11.2011, 12:16
Цитата(Stolzen @ 17.11.2011,  09:34)
А что пользователь может ввести в данном случае, чтобы похакать программу?

В пределе - считайте что поставил на рабочее место свою программу.

По удобству прямого и полного доступа к ScriptEngineManager та же SQL иньекция - просто муки адовы для хакера smile

Вспомнился пример использования, в ERP ADempiere очень много можно кастомизировать с помощью js кода. 
Защиту не смотрел.

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

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

Автор: Stolzen 17.11.2011, 12:58
Любопытно было бы посмотреть на строку, при выполении которой делается что-то типа "rm ~ -rf".
И интересно, js который в java, умеет работать с файлами? Ведь в бразуерах на это ограничение.
Я так понимаю, что к внутренностям программы просто так из js кода не получишь доступ - там же нет замыкания на переменные метода, из которого вызван скрипт?

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

Автор: Skynin 17.11.2011, 22:02
Цитата

 интересно, js который в java, умеет работать с файлами?

Он работает со всеми классами из JRE.
"Своей" библиотеки у него нет. Только движок JavaScript'а.

Вот если Jython подцепить, ну тогда к JRE еще и питоновская библиотека будет.

Цитата
Я так понимаю, что к внутренностям программы просто так из js кода не получишь доступ - там же нет замыкания на переменные метода

Зато есть все та же интроспекция, создание объектов и т.д.

С некоторыми нюансами.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)