2016-09-29 59 views
0

注射後您能得到鑰匙嗎?隱藏在這樣的安全內部的代碼空嗎?

var outside=[]; 

var NULL=(function(){ 
    var key=''; 
    console.log("Hi, I'm null!"); 
    window.injectkey=function(k){ 
     window.injectkey=null; 
     key=k; 
     return; 
     }; 
    window.askmeforkey=function(){return "nope! I could use my key for stuff though...";} 
    setTimeout(function(){ 
     outside.push("I still exist and can alter things outside but you can't see me!"); 
     console.log(outside); 
     },1000); 
    })(); 
NULL=null; 
console.log('NULL=='+NULL); // prints NULL==null 

後嘗試

console.dir(NULL); // prints null 

injectkey('xyz'); 

並再次

injectkey('abc'); // Uncaught TypeError: injectkey is not a function(…) 

askmeforkey() // nope 

可能的用途:(說,關鍵可能在任何地方不硬編碼的加密密鑰,多數民衆贊成)

injectkey可以通過一些s來完成許多方面ecure encrypted messaging

+1

定義「安全」。無論任何定義是否「安全」,都沒有意義。如果沒有'NULL'變量,幾乎可以以完全相同的方式完成同樣的事情。 –

+0

是的,我選擇null是因爲我喜歡它的聲音!如果我的問題是隱瞞事實,你也會說這也是毫無意義的! (消極性更沒有意義) –

+0

@ T.J.Crowder安全一樣 - 你能讀/看/更改/刪除密鑰嗎? –

回答

2

key對匿名函數完全是私有的。請注意,有沒有需要NULL在這裏的所有,這並不完全一樣的事情:

var outside=[]; 

(function(){ 
    var key=''; 
    console.log("Hi, I'm null!"); 
    window.injectkey=function(k){ 
     window.injectkey=null; 
     key=k; 
     return; 
     }; 
    window.askmeforkey=function(){return "nope! I could use my key for stuff though...";} 
    setTimeout(function(){ 
     outside.push("I still exist and can alter things outside but you can't see me!"); 
     console.log(outside); 
     },1000); 
    })(); 

這是爲了避免暴露變量更廣泛的比需要一個共同的模式。

+0

所以這很常見!而且沒有辦法獲得鑰匙?! –

+1

@BenMuircroft:除非你明確地做了某些事情讓它在外面可用(例如,作爲你已經暴露函數的函數的返回值),否則無論如何。 –

+1

@BenMuircroft:當然,* nothing是用戶的私人內容。他們可以在一行中放置一個斷點(比如在超時回調中),然後在調試器中檢查「key」。但是沒有* code *可以從該範圍函數外部訪問'key'。 –