Chcę, aby moja aplikacja oceniała wyrażenie od niezaufanego użytkownika, który będę czytać z pliku JSON. Takich jak:Jak oceniać wyrażeń użytkownika w piaskownicy
value = "(getTime() == 60) AND isFoo('bar')"
Znalazłem wiele wątków na ten temat tutaj na StackOverflow. Zwykle zaleca się używanie własnej klasy ScriptEngine, która potrafi czytać JavaScript. Lub polecić użytkownikowi użyć istniejącej biblioteki takie jak JEXL, MVEL lub dowolny inny z tej listy: http://java-source.net/open-source/expression-languages
Ale wszystkie one wydają się polegać na zaufanego użytkownika (np .: plik konfiguracyjny piszesz siebie i chcesz zrobić w tym skrypt). Ale w moim przypadku chcę, aby moja ocena wyrażeń była uruchamiana w bezpiecznym środowisku izolowanym. Tak więc użytkownik nie może zrobić nic tak prostego jak:
value = "while(true)" // or
value = "new java.io.File(\"R:/t.txt\").delete()" // this works on MVEL
I zablokuj moją aplikację lub uzyskaj dostęp do niechcianych zasobów.
1) Czy więc którakolwiek z istniejących bibliotek może być łatwo skonfigurowana, aby mogła działać na bezpiecznym pudełku? Mówiąc "łatwo", mam na myśli API konfiguracji wysokiego poziomu, który byłby dla mnie szybszy w użyciu niż napisanie własnego ewaluatora wyrażeń. Po wykonaniu trochę własnych badań, zarówno JEXL, jak i MVEL wydają się być niedostępne.
2) Czy istnieje istniejący język wyrażeń, który jest niezwykle prosty, aby nie mógł zostać wykorzystany przez niezaufanego użytkownika? Wszystkie te, które znalazłem, są bardzo złożone i implementują takie rzeczy jak pętle, instrukcje importu itp. Wszystko, czego potrzebuję, to parsowanie matematyki, operatorów logicznych i własnych zdefiniowanych zmiennych i metod. Cokolwiek poza tym jest poza moim zakresem.
3) Jeśli jedynym rozwiązaniem jest napisanie własnego ewaluatora wyrażeń, to gdzie mogę znaleźć wskazówki, jak napisać spójny model bezpieczeństwa? Jestem na tym początku i nie mam pojęcia, jakie są najczęstsze sztuczki używane do wstrzykiwania kodu. Właśnie dlatego chciałem, abyśmy nie musieli pisać tego na własną rękę.
Może istnieć kilka przydatnych informacji z następującym pytaniem (która zajmuje się nieco twardszej sytuacji niezaufanych kodu Java): http://stackoverflow.com/questions/9041246/what-is-the-the-risk-risks-i-should-guard-against-when-running-user-provided-ja/9041423 # 9041423 – DNA
Czy kiedykolwiek dostałeś odpowiedź na to pytanie? – ccleve
Nic, co by mnie usatysfakcjonowało. Postanowiłem po prostu zbudować własny i nauczyć się go, jak idę. – VIBrunazo