язык выражений Java, который не может получить доступ к «небезопасным» методам Java - PullRequest
3 голосов
/ 27 июня 2009

Я работаю над проектом, в котором я позволю пользователям отправлять небольшие «сценарии» на сервер, и я буду выполнять эти сценарии. Существует много языков сценариев, которые могут быть встроены в Java-программу, таких как mvel, ognl, uel, clojure, rhino javascript и т. Д., Но, насколько я могу судить, все они позволяют сценаристу вызывать конструкторы Java, методы и т. д.

Я не хочу, чтобы мои пользователи могли вызывать то, что я им не предоставляю (обычно через какой-то объект контекста). Большинство их сценариев будут арифметическими и логическими выражениями, в некоторых случаях им потребуется пройти через свойства объекта (получатели / установщики) или содержимое карты. Я просто не хочу, чтобы они убегали из песочницы, которую я им предоставляю.

Есть предложения?

Ответы [ 3 ]

2 голосов
/ 27 июня 2009

Я думаю, что вы можете достичь этого с помощью политики безопасности .

2 голосов
/ 17 декабря 2009

Всего:

  //Remember old one
  ClassLoader orginalClassLoader = Thread.currentThread().getContextClassLoader();
  //Set my classloader
  ClassLoader myClassLoader = new SecureMVELClassLoader();
  Thread.currentThread().setContextClassLoader(myClassLoader);

  System.out.println(MVEL.eval("new com.myapp.insecure.InsecureClass()"));
  //Set back to original classloader
  Thread.currentThread().setContextClassLoader(orginalClassLoader);

и в моем классе загрузчик

public class SecureMVELClassLoader extends ClassLoader {


 @Override
 public Class<?> loadClass(String name) throws ClassNotFoundException {
        //some filter logic here
  if (name.startsWith("com.myapp.insecure.")) throw new ClassNotFoundException();
  return super.loadClass(name);
 }
1 голос
/ 27 июня 2009

Построить функционирующую песочницу сложно. Что вы можете сделать, использовать пользовательский загрузчик классов, который позволяет искать только несколько типов из его родителя.

...