讓我解釋標題。是否可以安全地取消引用字符串
假設我們有一個包含密碼的字符串,當我們發送了這個密碼,例如BE哈希值和鹽值時,我們希望擺脫這個值。
這麼說來,這是不可行的:
var pw = 'somePw';
// later
pw = 'someGarbage';
字符串是不可變的,所以我們不會重寫存儲器中的價值,但創建一個新的和舊的價值仍然存在於內存,但取消引用如此由GC解放,我們仍然可以立即擺脫它 - >不安全。
我該如何解決這個問題?
讓我解釋標題。是否可以安全地取消引用字符串
假設我們有一個包含密碼的字符串,當我們發送了這個密碼,例如BE哈希值和鹽值時,我們希望擺脫這個值。
這麼說來,這是不可行的:
var pw = 'somePw';
// later
pw = 'someGarbage';
字符串是不可變的,所以我們不會重寫存儲器中的價值,但創建一個新的和舊的價值仍然存在於內存,但取消引用如此由GC解放,我們仍然可以立即擺脫它 - >不安全。
我該如何解決這個問題?
我不確定JavaScript內部工作是如何工作的,它可能依賴於實現,但也許可以將該值存儲爲對象的屬性,然後刪除該屬性。由於刪除屬性會將其用於垃圾回收,並隨後釋放,但我不知道該值是否仍會存儲在內存中。
var passwordObject = { pass: "somepass" };
delete passwordObject.pass;
謝謝,我也認爲它可能會工作,但我不確定。使用delete是什麼意思?這是否意味着它會清除內存區域或將它標記爲「自由GCd」? –
閱讀我最近的修改... – thephpdev
您可以將pw存儲在一個對象中,並在完成時使用它的刪除操作符。
var user = {
password: "pw"
}
delete user.password
您還可以設置pw = null
這兩種方法都將釋放內存空間垃圾回收週期發生之後。
道格拉斯克羅克福德喜歡後面的方法,而不是第一個http://javascript.crockford.com/memory/leak.html ,因爲他解釋了與第一種方法相關的一些內存泄漏問題。但是我不認爲這些在現代瀏覽器中仍然是個問題。
你試圖解決什麼問題?只有能夠訪問機器的人才能夠轉儲內存。 – Barmar
你沒有問題,你是過度工程。 – Tomalak
我不認爲有任何方法可以訪問Javascript引擎的原始內存。 – Barmar