2012-03-05 12 views
6

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ę.

+1

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

+0

Czy kiedykolwiek dostałeś odpowiedź na to pytanie? – ccleve

+0

Nic, co by mnie usatysfakcjonowało. Postanowiłem po prostu zbudować własny i nauczyć się go, jak idę. – VIBrunazo

Odpowiedz

1

Mogę polecić osadzanie Rhino, umożliwiając użytkownikowi pisanie javascript. Pasuje do twoich kryteriów w (2) idealnie jest biblioteką java, która pozwala ci na uruchamianie javascript (lub uruchamianie java z javascript).

Skonfigurowano kontekst, a użytkownik ma dostęp tylko do tego, co umieszcza się w kontekście lub udostępnia z niego. Wyrażenia javascript mogą być tak proste, jak w najprostszym przypadku, który pokazałeś powyżej, lub mogą być tak złożone, jak powinny. Osadzanie Rhino i eksponowanie ograniczonego zestawu obiektów było świetnym sposobem na umożliwienie wszelkiego rodzaju skrypty użytkownika w przeszłości projektu i to było kilka lat temu, Rhino jest teraz dość dojrzały.

Masz także tę zaletę, że jeśli twój problem tego wymaga, możesz go skonfigurować tak, aby te same wyrażenia z przyjemnością działały po stronie klienta lub serwera.

Więcej informacji na osadzanie Rhino, aby osiągnąć to, czego potrzebujesz w http://www.mozilla.org/rhino/tutorial.html#runScript

Powiązane problemy