2010-11-12 2 views
0

Есть ли язык, который имеет функцию, которая может препятствовать доступу класса к любому другому классу, если только не содержится экземпляр или ссылка?Существует ли модификатор доступа к изоляции/песочнице на любом языке?

isolated class Example { 

    public Integer i; 

    public void doSomething() 
    { 
     i = 5; // This is ok because i belongs to this class 

     /* 
     * This is forbidden because this class can only 
     * access anything contained within, nothing outside 
     */ 
     System.out.println("This does not work."); 
    } 
} 

[изменить] пример использования случай может быть плагин системы. Я мог бы определить объект плагина со ссылками на определенные объекты, которые класс может манипулировать, но ничего больше не допустимо. Это может потенциально сделать проблемы безопасности намного проще. [/ Edit]

ответ

1

Я не знаю каких-либо модификаторов доступа на основе классов с таким намерением, но я считаю, что модификаторы доступа в любом случае будут ошибочными.

Безопасность на основе возможностей или, более конкретно, модель объектных возможностей, по-видимому, является тем, что вы хотите.

http://en.wikipedia.org/wiki/Object-capability_model

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

Глобальные вещи (такие как System.out.println) и некоторые другие вещи являются проблематичными особенностями языка, потому что любой может получить к ним доступ без ссылки.

Языки, такие как E, или такие инструменты, как google caja (для Javascript), позволяют создавать модели объектных возможностей. Здесь пример в JS:

function Example(someObj) { 

    this.someObj = someObj; 

    this.doStuff() = function() { 
     this.someObj.foo(); //allowed, we have been given a reference to it 
     alert("foobar"); //caja may deny/proxy access to global "alert" 
    } 
} 
1

Любой язык, на котором вы должны включать заголовки, вероятно, учитывается: просто не включайте заголовки.

Однако я бы сказал, что нет языка, который явно запрещает внешний доступ. В чем смысл? Вы не можете ничего сделать, если не можете получить доступ к внешнему миру. И, почему ссылка на Integer будет в порядке, но System.out.println не будет?

Если вы уточнить потенциальный потребительский случай, вероятно, мы можем помочь вам лучше ...

Edit для редактирования:

Я думал, что вы могли бы идти туда.

Если это необходимо для обеспечения безопасности, оно является ошибочным с самого начала. Давайте рассмотрим:

class EvilCode { 
    void DoNiceThings() { 
     HardDrive.Format(); 
    } 
} 

Какой у меня стимул для добровольного размещения ключевого слова в моем классе? Я, конечно, не собираюсь, потому что я хороший, так как я не!

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

Правильный ответ зависит от вашего целевого языка. Java имеет дескрипторы безопасности, .NET позволяет создавать AppDomains с ограниченными разрешениями и т. Д. К сожалению, я не специалист в этих областях.

+0

Я сделал редактирование оригинального вопроса в прецеденте, надеюсь, он станет более понятным. Я вижу, что это несколько неоднозначно, потому что я не на 100% влияю на последствия такой функции, поэтому у меня нет яркой картины. – ArturPhilibin

+0

@DaSilva: Я обновил свой ответ.Надеюсь, это лучше ответит на ваш вопрос. –