是否存在任何语言的隔离/沙箱访问修饰符?

时间:2010-11-12 19:04:53

标签: oop access-modifiers

是否有一种语言具有可以阻止类访问任何其他类的功能,除非包含实例或引用?

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]示例用例可能是插件系统。我可以定义一个插件对象,引用类可以操作的某些对象,但不允许任何其他对象。它可能会使安全问题变得更加容易。[/ edit]

2 个答案:

答案 0 :(得分:1)

任何必须包含标题的语言都可能会计算:只是不要包含任何标题。

但是,我敢打赌,没有明确禁止外部访问的语言。重点是什么?如果您无法访问外部世界,您将无法做任何事情。而且,为什么Integer的引用可以正常,但System.out.println不是?

如果您澄清潜在的用例,我们可能会帮助您更好......

编辑您的编辑:

我以为你可能会去那里。

如果这是为了安全起见,那从一开始就存在缺陷。我们来看看:

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

我有什么动力自愿在课堂上放置关键词?我当然不会去,因为我很好,因为我不是!

要考虑的一件事是,无论何时加载不属于您自己的本机代码(原生代,在这种情况下,意味着没有编写脚本),您可能会允许坏人运行他的代码。没有任何语言功能可以保护您。

正确答案取决于您的目标语言。 Java具有安全描述符,.NET允许您创建具有受限权限的AppDomain等。不幸的是,我不是这些领域的专家。

答案 1 :(得分: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"
    }
}
相关问题