2010-11-12 54 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."); 
    } 
} 

一個示例用例可能是一個插件系統。我可以定義一個插件對象,引用某些類可以操作的對象,但是沒有其他的東西是允許的。這可能使安全問題更容易[/編輯]

回答

1

我不知道有這樣的意圖任何基於類的訪問修飾符,但我相信訪問修飾符無論如何都要誤導。

基於能力的安全性,或者更準確地說,對象,能力模型似乎是你想要的。

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

的基本思想是,爲了做任何一個對象,你需要保持對它的引用。保留參考文獻並且不可能訪問。

全球的東西(如的System.out.println)和其他一些東西是語言的問題特點,因爲任何人都可以不參考訪問它們。

語言,如E,或者像谷歌卡哈(爲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不是?

如果你澄清潛在的用例,我們或許可以幫助你更好的...

編輯爲您編輯:

我想你可能會去那裏。

如果這是爲了安全起見,它從一開始就有缺陷。讓我們來看看:

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

什麼激勵我必須在我的課堂上自動放置關鍵字?我當然不會去,因爲我很好,因爲我不是!

有一點要考慮的是,任何時候你加載本地代碼,這不是你自己(原生,在這種情況下,意味着沒有劇本),你可能允許一個壞傢伙跑他的代碼。沒有語言功能會保護你免受這種情況的侵害。

正確答案取決於您的目標語言。 Java具有安全描述符,.NET允許您創建具有受限權限的AppDomain等。不幸的是,我不是這些領域的專家。

+0

我做編輯與用例原來的問題,我希望這使得它更清晰。我可以看到這是一種模棱兩可,這是因爲我不是100%的這種功能的影響,所以我沒有一個生動的圖片。 – ArturPhilibin 2010-11-12 19:15:30

+0

@DaSilva:我已經更新了我的答案。希望能更好地回答你的問題。 – 2010-11-12 19:22:42