Существует ли модификатор доступа изолят / песочница на каком-либо языке? - PullRequest
0 голосов
/ 12 ноября 2010

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

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]

Ответы [ 2 ]

1 голос
/ 13 ноября 2010

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

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

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 голос
/ 12 ноября 2010

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

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

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

Правка для вашей правки:

Я подумал, что вы, возможно, поедете туда.

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

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

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

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

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

...