2016-08-18 29 views
0

如果我們考慮這段代碼,是不是安全風險,如果是的話,爲什麼java允許它?爲什麼我可以增加子類中重載方法的可見性,它不是安全風險嗎?

class SomeApi 
{ 
    void someImportantInnerApiMethod() 
    { 
    //some operation 
    } 
} 

class MaliciousUserClass extends SomeApi 
{ 
    @Override 
    public void someImportantInnerApiMethod() 
    { 
     super.someImportantInnerApiMethod(); 
     //inner api method now exposed 
    } 
} 
+3

可見性與安全性無關。 –

+0

「爲什麼」的問題過於寬泛,請參閱Eric Lippert的回答[如果語言規範問「爲什麼」仍然被認爲是「主要基於意見的」,如果它可以有正式答案?](http://meta.stackoverflow.com/q/323334/217324)我想這裏的答案是,因爲它不會傷害任何東西;如果你想確定一種方法,你可以把它做成最終的。 –

+0

@DonBranson假設我有一個API&一些類是像上面的類「SomeApi」&用戶決定擴展和顯示所有內部保護/默認方法,那麼這不是一個安全問題? –

回答

6

訪問修飾符不用於安全性。無論如何,你甚至可以通過反射來調用私人方法。它們意味着封裝,從而避免編程錯誤,並在一定程度上強化良好的編程風格。

即使你不能讓重載方法公開,你仍然可以這樣做:

class SomeApi 
{ 
    void someImportantInnerApiMethod() 
    { 
    //some operation 
    } 
} 

class MaliciousUserClass extends SomeApi 
{ 
    public void aMethodWithATotallyDifferentName() 
    { 
     // ... that still exposes that important inner API method! 
     super.someImportantInnerApiMethod(); 
    } 
} 

既然你可以通過這種方式,「訪問」,Java那樣的事情就是讓你在保持方法名稱的同時做同樣的事情,如果你真的想這樣做的話。沒有傷害,因爲你通常不會意外地做這種事情。

也可能值得一提的是,包私有訪問是非常容易規避的:與.Net的internal不同,您可以將您的類真正放在與您正在使用的另一個庫相同的包中,而且您可以自由調用包私有方法!比如說,你聲明你的類是javax.swing包的一部分,現在它可以調用Swing的包私有方法。非常安全。你甚至不需要繼承和/或反思。

+0

我意識到這是有史以來最愚蠢的問題!謝謝你這麼清楚地指出它。 –

+1

我不會說這是一個愚蠢的問題,雖然我從來沒有想過它是一個問題,但我確實喜歡閱讀謝爾蓋的迴應。 另外他們不說他們沒有愚蠢的問題。 – mpop

相關問題