天天看點

保護JavaScript用戶端APP的最有效方法

保護JavaScript用戶端APP的最有效方法

用戶端技術,如 javascript,有很多有用的特性,正因為如此,它成為了世界上最流行的語言之一。它有很多優點,即時解析就是其一。即時解析有不少優點,比如可以在浏覽器下載下傳代碼并立即執行。然而,自由度越高,責任越大。

我們會在這篇文章中深入 javascript 的安全隐患,不過範圍僅限于浏覽器中運作的前端代碼。我們會關注一些将來産生的其它類型。

現在發揮你的想像,浏覽器總是要執行代碼的,它首先下載下傳頁面并進行解析。浏覽器有着下載下傳和解析同時進行的能力,是以它不會等待所有東西下載下傳完成。那麼,它遇到 javascript 的時候會發生什麼事情?

javascript會阻塞渲染,這在它執行的時候是個巨大的優勢。但這意味着浏覽器将停止解析,直到執行完 javascript 後才會繼續。這一特點給于這種程式設計語言極大的靈活性,它可以打開任意數量的代碼。

但問題在于,這個特性會帶來什麼樣的影響?

<div id="hack-target"></div> 

<button>set value</button>   

<script> 

  document.queryselector('button').addeventlistener('click', setvalue);   

  function setvalue() { 

    var value = '2'; 

    document.getelementbyid('hack-target').innertext = value; 

  }</script> 

這段代碼為 html 綁定事件,當你點選按鈕的時候,觸發回調。

對于用戶端的 javascript,你可以在設定值的地方設定一個斷點。這個斷點會在事件觸發的時候擊中。var value = '2';

用于設定值,而且可以修改。調試器會在這裡暫停并允許篡改頁面。這一功能非常有用,而且當它發生的時候,浏覽器不會對它進行标記。

既然調試器暫停了執行代碼,它同時也暫停了渲染。調試器本身是浏覽器提供的工具之一,任何人都可以使用。這就是 web developer tools(開發者工具)。

在 code pen 上可以看到這種技術的應用。下面是關于這個特性的截圖:

保護JavaScript用戶端APP的最有效方法

這一特性對調試 javascript 十分有用,但是它的安全性如何呢?

這個特性意味着攻擊者可以在運作時改變 javascript。攻擊者可以通過斷點暫時執行,然後修改 dom 并在控制台輸入任意 javascript 代碼。這類功能可以利用用戶端的漏洞,更改資料,支援會話并在頁面内用 javascript 作出任意改動。

例如,打開開發者工具,進入控制台頁面,并輸入:

document.queryselector('button') 

        .addeventlistener('click', function () {  

            alert('sacked'); 

        });` 

下次這個事件再觸發的時候,它會執行修改後的 javascript 代碼。

為什麼是 javascript?

ecmascript

是一個标準,任何浏覽器都被要求支援這個标準,這樣在使用不同的浏覽器時才會不發生沖突。也就是說,你可以為谷歌浏覽器寫一段代碼,但它同時也能在

opera、netscape、internet explorer 和 microsoft edge 中運作。javascript

建立于靈活的環境,它有能力讓你做你想做的事情。這些設計原則使用 javascript 自然具有了動态的天賦,也使它成為浏覽器的語言。

這些都已經成為曆史,但與 javascript 的安全性有什麼關系?

用戶端安全

為了防止惡意的 javascript 代碼,最好的選擇是添加運作時保護。運作時程式自我保護(runtime application

self-protection,rasp)将在執行用戶端代碼的時候對它加以保護。随着 web 靈活性和動态性的到來,攻擊者通過用戶端

javascript 進行攻擊成為可能,運作時安全也成為必要。

運作時程式自我保護是一種安全技術,它建立或連結到應用程式或其運作環境,并控制應用程式執行,檢測和防止實時攻擊。

一旦javascript 在浏覽器中執行,沒有任何東西對其完全防護。rasp

會防範發生在運作時的高度和代碼篡改攻擊,包括在離線狀态修改應用程式的攻擊。一個好的 rasp

解決方案也會保護自身代碼,使攻擊者不能篡改解決方案本身,或者直接繞過它。這幾層保護保證着開放網絡的安全。

如果 rasp 不錯,它會在攻擊者嘗試阻止代碼的時候發出通知,以便使用者知道并采取行動,比如取消使用者會話。

rasp 解決方案來保證應用不受到運作時攻擊。它會自我防禦并檢測篡改。它的自我防禦能力會激活對 javascript

應用的保護。jscrambler 使用反調試和反篡改技術——衆所周知的應用程式保護概念——對 javascript

而言明确現實和局限。反調試功能檢測調試工具(比如 devtools,

firebug)的使用,并試圖阻止逆向工程師使用它來調試應用。它包含一些預置的代碼陷阱,使調試器停止工作,造成堆棧的增長,阻止使用者探查應用的控制流。反篡改功能則會檢查代碼的變化,并做出反應。比如,你在自動防禦所保護的一個函數中添加/删除一個分号,它會檢測到變化,然後停止運作代碼。兩種技術與代碼混淆結合會使得對應用程式的篡改寸步難行。

結論

實作 javascript 的安全性必須考慮在運作時會發生什麼。它本質上來說是為 web 的靈活性而生的動态語言。它是一柄雙刃劍,使用的時候一定要注意到應盡的責任。

作者:佚名

來源:51cto

繼續閱讀