Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вычисление математических выражений из String 
:(
    Опции темы
firedrago
Дата 16.11.2011, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 22.9.2005

Репутация: 2
Всего: 3



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

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));
    }
}





Это сообщение отредактировал(а) firedrago - 16.11.2011, 12:10
PM MAIL   Вверх
priam220
Дата 16.11.2011, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: 7
Всего: 8



Само появление такой необходимости кажется странным.
PM MAIL   Вверх
firedrago
Дата 16.11.2011, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 22.9.2005

Репутация: 2
Всего: 3



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

Необходимость появляется тогда, когда юзер сам задает формулу для вычислений, с константами, скобками и т.д. или есть лучшее решение?
PM MAIL   Вверх
Skynin
Дата 16.11.2011, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 1.7.2007
Где: Харьков

Репутация: 6
Всего: 10



Цитата

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

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

Вопрос правда о безопасности, если пользователь хакер, то ввести может не только мат формулу smile
Так что нужно бы как-то верифицировать вводимое на предмет допустимости операций.
PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
Stolzen
Дата 17.11.2011, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



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


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
firedrago
Дата 17.11.2011, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 22.9.2005

Репутация: 2
Всего: 3



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

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

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


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

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


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

теоретически - любой код, любой длины на JS (хотя я думаю, что скорее всего ничего ужастного сделать не получится), практически - надо разбераться....
PM MAIL   Вверх
Skynin
Дата 17.11.2011, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 1.7.2007
Где: Харьков

Репутация: 6
Всего: 10



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

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

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

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

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

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

PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
Stolzen
Дата 17.11.2011, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



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

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


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Skynin
Дата 17.11.2011, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 1.7.2007
Где: Харьков

Репутация: 6
Всего: 10



Цитата

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

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

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

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

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

С некоторыми нюансами.
PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0895 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.