日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

前端 JS 安全對抗原理與實踐

來源: 責編: 時間:2023-12-21 17:12:16 273觀看
導讀一、概念解析1.1 什么是接口加密如今這個時代,數據已經變得越來越重要,網頁和APP是主流的數據載體,如果獲取數據的接口沒有設置任何的保護措施的話,數據就會被輕易地竊取或篡改。除了數據泄露外,一些重要功能的接口如果沒

2aV28資訊網——每日最新資訊28at.com

一、概念解析

1.1 什么是接口加密

如今這個時代,數據已經變得越來越重要,網頁和APP是主流的數據載體,如果獲取數據的接口沒有設置任何的保護措施的話,數據就會被輕易地竊取或篡改。2aV28資訊網——每日最新資訊28at.com

除了數據泄露外,一些重要功能的接口如果沒有做好保護措施也會被惡意調用造成DDoS、條件競爭等攻擊效果,比如如下幾個場景:2aV28資訊網——每日最新資訊28at.com

圖片2aV28資訊網——每日最新資訊28at.com

一些營銷活動類的Web頁面,領紅包、領券、投票、抽獎等活動方式很常見。此類活動對于普通用戶來說應該是“拼手氣”,而對于非正常用戶來說,可以通過直接刷活動API接口的這種“作弊”方式來提升“手氣”。這樣對普通用戶來說就很不公平。2aV28資訊網——每日最新資訊28at.com

所以對重要接口都會采用加密驗簽的方式進行保護,而驗簽的加密邏輯大多數都通過JS代碼實現,所以保護JS代碼不被攻擊者竊取尤為重要。2aV28資訊網——每日最新資訊28at.com

1.2 為什么要保護JS代碼

  • JavaScript代碼運行于客戶端
  • JavaScript代碼是公開透明的

由于這兩個原因,致使JavaScript代碼是不安全的,任何人都可以讀、分析、復制、盜用甚至篡改。2aV28資訊網——每日最新資訊28at.com

1.3 應用場景

以下場景就通過特定的防護措施提高了攻擊成本:2aV28資訊網——每日最新資訊28at.com

  • 某些網站會在頁面中使用JavaScript對數據進行加密,以保護數據的安全性和隱私性,在爬取時需要通過解密JavaScript代碼才能獲取到數據。
  • 某些網站的URL會有某個參數帶有一些看不太懂的長串加密參數,攻擊者要爬取的話就必須要知道這些參數是怎么構造的,否則無法正確地訪問該URL。
  • 翻看網站的JavaScript源代碼,可以發現很多壓縮了或者看不太懂的字符,比如JavaScript文件名被編碼,JavaScript的文件內容都壓縮成幾行,JavaScript變量也被修改成單個字符或者一些十六進制的字符,所以我們不能輕易地根據JavaScript找出某些接口的加密邏輯。

1.4 涉及的技術

這些場景都是網站為了保護數據不被輕易抓取采取的措施,運用的技術主要有:2aV28資訊網——每日最新資訊28at.com

  • 接口加密技術
  • JavaScript壓縮、混淆和加密技術

二、技術原理

2.1 接口加密技術

數據和功能一般是通過服務器提供的接口來實現,為了提升接口的安全性,客戶端會和服務端約定一種接口檢驗方式,通常是各種加密和編碼算法,如Base64、Hex、MD5、AES、DES、RSA等。2aV28資訊網——每日最新資訊28at.com

常用的數據接口都會攜帶一個sign參數用于權限管控:2aV28資訊網——每日最新資訊28at.com

① 客戶端和服務端約定一種接口校驗邏輯,客戶端在每次請求服務端接口的時候附帶一個sign參數。
② sign參數的邏輯自定義,可以由當前時間戳信息、設備ID、日期、雙方約定好的秘鑰經過一些加密算法構造而成。
③ 客戶端根據約定的加密算法構造sign,每次請求服務器的時候附帶上sign數。
④ 服務端根據約定的加密算法和請求的數據對sign進行校驗,如果檢驗通過,才返回數據,否則拒絕響應。2aV28資訊網——每日最新資訊28at.com

圖片2aV28資訊網——每日最新資訊28at.com

這就是一個比較簡單的接口參數加密的實現,如果有人想要調用這個接口的話,必須要破解sign的生成邏輯,否則是無法正常調用接口的。2aV28資訊網——每日最新資訊28at.com

當然上面的實現思路比較簡單,還可以增加一些時間戳信息和訪問頻次來增加時效性判斷,或使用非對稱加密提高加密的復雜程度。2aV28資訊網——每日最新資訊28at.com

實現接口參數加密需要用到一些加密算法,客戶端和服務器都有對應的SDK來實現這些加密算法,如JavaScript的crypto-js、Python的hashlib、Crypto等等。如果是網頁且客戶端的加密邏輯是用JavaScript來實現的話,其源代碼對用戶是完全可見的,所以我們需要用壓縮、混淆、加密的方式來對JavaScript代碼進行一定程度的保護。2aV28資訊網——每日最新資訊28at.com

2.2 什么是壓縮

去除JavaScript代碼中不必要的空格、換行等內容,使源碼都壓縮為幾行內容,降低代碼可讀性,同時可提高網站的加載速度。2aV28資訊網——每日最新資訊28at.com

如果僅僅是去除空格換行這樣的壓縮方式,幾乎沒有任何防護作用,這種壓縮方式僅僅是降低了代碼的直接可讀性,可以用IDE、在線工具或Chrome輕松將JavaScript代碼變得易讀。2aV28資訊網——每日最新資訊28at.com

所以JavaScript壓縮技術只能在很小的程度上起到防護作用,想提高防護的效果還得依靠JavaScript混淆和加密技術。2aV28資訊網——每日最新資訊28at.com

2.3 什么是混淆

使用變量混淆、字符串混淆、屬性加密、控制流平坦化、調試保護、多態變異等手段,使代碼變得難以閱讀和分析,同時不影響代碼原有功能,是一種理想且實用的JS保護方案。2aV28資訊網——每日最新資訊28at.com

  • 變量混淆:將變量名、方法名、常量名隨機變為無意義的亂碼字符串,降低代碼可讀性,如轉成單個字符或十六進制字符串。
  • 字符串混淆:將字符串陣列化集中放置,并進行MD5或Base64編碼存儲,使代碼中不出現明文字符串,可以避免使用全局搜索字符串的方式定位到入口點。
  • 屬性加密:針對JavaScript對象的屬性進行加密轉化,隱藏代碼之間的調用關系,把key-value的映射關系混淆掉。
  • 控制流平坦化:打亂函數原有代碼執行流程及函數調用關系,使代碼邏輯變得混亂無序。
  • 調試保護:基于調試器特性,加入一些強制調試debug語句,無限debug、定時debug、debug關鍵字,使其在調試模式下難以順利執行JavaScript代碼。
  • 多態變異:JavaScript代碼每次被調用時,代碼自身立刻自動發生變異,變化為與之前完全不同的代碼,避免代碼被動態分析調試。

2.4 什么是加密

JavaScript加密是對JavaScript混淆技術防護的進一步升級,基本思路是將一些核心邏輯用C/C++語言來編寫,并通過JavaScript調用執行,從而起到二進制級別的防護作用,加密的方式主要有Emscripten和WebAssembly等。2aV28資訊網——每日最新資訊28at.com

1. Emscripten2aV28資訊網——每日最新資訊28at.com

Emscripten編譯器可以將C/C++代碼編譯成asm.js的JavaScript變體,再由JavaScript調用執行,因此某些JavaScript的核心功能可以使用C/C++語言實現。2aV28資訊網——每日最新資訊28at.com

2.WebAssembly2aV28資訊網——每日最新資訊28at.com

WebAssembly也能將C/C++代碼轉成JavaScript引擎可以運行的代碼,但轉出來的代碼是二進制字節碼,而asm.js是文本,因此運行速度更快、體積更小,得到的字節碼具有和JavaScript相同的功能,在語法上完全脫離JavaScript,同時具有沙盒化的執行環境,利用WebAssembly技術,可以將一些核心的功能用C/C++語言實現,形成瀏覽器字節碼的形式,然后在JavaScript中通過類似如下的方式調用:2aV28資訊網——每日最新資訊28at.com

圖片2aV28資訊網——每日最新資訊28at.com

這種加密方式更加安全,想要逆向或破解需要逆向WebAssembly,難度極大。2aV28資訊網——每日最新資訊28at.com

2.5 工具介紹

2.5.1 壓縮混淆工具2aV28資訊網——每日最新資訊28at.com

  • Uglifyjs(開源):

    用NodeJS編寫的JavaScript壓縮工具,是目前最流行的JS壓縮工具,JQuery就是使用此工具壓縮,UglifyJS壓縮率高,壓縮選項多,并且具有優化代碼,格式化代碼功能。
  • jshaman
    jshaman是一個商業級工具,看了很多社區的評論,這個目前是最好的,可以在線免費使用,也可以購買商業版。
  • jsfuck
    開源的js混淆工具,原理比較簡單,通過特定的字符串加上下標定位字符,再由這些字符替換源代碼,從而實現混淆。
  • YUI Compressor
    業界巨頭yahoo提供的一個前端壓縮工具,通過java庫編譯css或js文件進行壓縮

2.5.2 反混淆工具2aV28資訊網——每日最新資訊28at.com

  • jsbeautifier
    jsbeautifier是一個為前端開發人員制作的Chrome擴展,能夠直接查看經過壓縮的Javascript代碼。
  • UnuglifyJS
    壓縮工具uglify對應的解混淆工具。
  • jspacker
    用PHP編寫的壓縮工具,可以混淆代碼保護知識產權,產生的代碼兼容IE、FireFox等常用瀏覽器,國內大部分在線工具網站都采用這種算法壓縮。

三、前端安全對抗

3.1 前端調試手法

3.1.1 Elements2aV28資訊網——每日最新資訊28at.com

Elements 面板會顯示目前網頁中的 DOM、CSS 狀態,且可以修改頁面上的 DOM 和 CSS,即時看到結果,省去了在編輯器修改、儲存、瀏覽器查看結果的流程。2aV28資訊網——每日最新資訊28at.com

有時候一些dom節點會嵌套很深,導致我們很難利用Element面板html代碼來找到對應的節點。inspect(dom元素)可以讓我們快速跳轉到對應的dom節點的html代碼上。2aV28資訊網——每日最新資訊28at.com

圖片2aV28資訊網——每日最新資訊28at.com

3.1.2 Console2aV28資訊網——每日最新資訊28at.com

Console對象提供了瀏覽器控制臺調試的接口,Console是一個對象,上面有很多方便的方法。2aV28資訊網——每日最新資訊28at.com

  • console.log( ):最常用的語句,可以將變量輸出到瀏覽器的控制臺中,方便開發者調用JS代碼
  • console.table( ):可用于打印obj/arr成表格
  • console.trace( ):可用于debugger堆棧調試,方便查看代碼的執行邏輯,看一些庫的源碼
  • console.count( ):打印標簽被執行了幾次,預設值是default,可用在快速計數
  • console.countReset( ):用來重置,可用在計算單次行為的觸發的計數
  • console.group( )/console.groupEnd( )
    為了方便一眼看到自己的log,可以用console.group自定義message group標簽,還可以多層嵌套,并用console.groupEnd來關閉Group。

3.1.3 JS斷點調試2aV28資訊網——每日最新資訊28at.com

JS斷點調試,即在瀏覽器開發者工具中為JS代碼添加斷點,讓JS執行到某一特定位置停住,方便開發者對該處代碼段進行分析與邏輯處理。2aV28資訊網——每日最新資訊28at.com

 Sources面板2aV28資訊網——每日最新資訊28at.com

① 普通斷點(breakpoint)2aV28資訊網——每日最新資訊28at.com

給一段代碼添加斷點的流程是:"F12(Ctrl + Shift + I)打開開發工具"->"點擊Sources菜單"->"左側樹中找到相應文件"→"點擊行號列"即完成在當前行添加/刪除斷點操作。當斷點添加完畢后,刷新頁面JS執行到斷點位置停住,在Sources界面會看到當前作用域中所有變量和值。2aV28資訊網——每日最新資訊28at.com

圖片2aV28資訊網——每日最新資訊28at.com

  • 恢復(Resume): 恢復按鈕(第一個按鈕),繼續執行,快捷鍵 F8,繼續執行,如果沒有其他的斷點,那么程序就會繼續執行,并且調試器不會再控制程序。
  • 跨步(Step over):運行下一條指令,但不會進入到一個函數中,快捷鍵 F10。
  • 步入(Step into):快捷鍵 F11,和“下一步(Step)”類似,但在異步函數調用情況下表現不同,步入會進入到代碼中并等待異步函數執行。
  • 步出(Step out):繼續執行到當前函數的末尾,快捷鍵 Shift+F11,繼續執行代碼并停止在當前函數的最后一行,當我們使用偶然地進入到一個嵌套調用,但是我們又對這個函數不感興趣時,我們想要盡可能的繼續執行到最后的時候是非常方便的。
  • 下一步(Step):運行下一條語句,快捷鍵 F9,一次接一次地點擊此按鈕,整個腳本的所有語句會被逐個執行,下一步命令會忽略異步行為。

啟用/禁用所有的斷點:這個按鈕不會影響程序的執行。只是一個批量操作斷點的開/關。2aV28資訊網——每日最新資訊28at.com

  • 察看(Watch):顯示任意表達式的當前值
  • 調用棧(Call Stack):顯示嵌套的調用鏈
  • 作用域(Scope):顯示當前的變量
  • Local:顯示當前函數中的變量
  • Global:顯示全局變量

② 條件斷點(Conditional breakpoint)2aV28資訊網——每日最新資訊28at.com

給斷點添加條件,只有符合條件時,才會觸發斷點,條件斷點的顏色是橙色。2aV28資訊網——每日最新資訊28at.com

圖片2aV28資訊網——每日最新資訊28at.com


2aV28資訊網——每日最新資訊28at.com

③ 日志斷點(logpoint)2aV28資訊網——每日最新資訊28at.com

當代碼執行到這里時,會在控制臺輸出你的表達式,不會暫停代碼執行,日志斷點式粉紅色。2aV28資訊網——每日最新資訊28at.com

圖片2aV28資訊網——每日最新資訊28at.com

debugger命令2aV28資訊網——每日最新資訊28at.com

通過在代碼中添加"debugger;"語句,當代碼執行到該語句的時候就會自動斷點,之后的操作和在Sources面板添加斷點調試,唯一的區別在于調試完后需要刪除該語句。2aV28資訊網——每日最新資訊28at.com

在開發中偶爾會遇到異步加載html片段(包含內嵌JS代碼)的情況,而這部分JS代碼在Sources樹中無法找到,因此無法直接在開發工具中直接添加斷點,那么如果想給異步加載的腳本添加斷點,此時"debugger;"就發揮作用了。2aV28資訊網——每日最新資訊28at.com

3.2 反調試手段

3.2.1 禁用開發者工具2aV28資訊網——每日最新資訊28at.com

監聽是否打開開發者工具,若打開,則直接調用JavaScript的window.close( )方法關閉網頁2aV28資訊網——每日最新資訊28at.com

① 監聽F12按鍵、監聽Ctrl+Shift+I(Windows系統)組合鍵、監聽右鍵菜單,監聽Ctrl+s禁止保存至本地,避免被Overrides。2aV28資訊網——每日最新資訊28at.com

<script>    //監聽F12、Ctrl+Shift+i、Ctrl+s    document.onkeydown = function (event) {        if (event.key === "F12") {            window.close();            window.location = "about:blank";        } else if (event.ctrlKey && event.shiftKey && event.key === "I") {//此處I必須大寫            window.close();            window.location = "about:blank";        } else if (event.ctrlKey && event.key === "s") {//此處s必須小寫            event.preventDefault();            window.close();            window.location = "about:blank";        }    };    //監聽右鍵菜單    document.oncontextmenu = function () {        window.close();        window.location = "about:blank";    };</script>

② 監聽窗口大小變化2aV28資訊網——每日最新資訊28at.com

<script>    var h = window.innerHeight, w = window.innerWidth;    window.onresize = function () {        if (h !== window.innerHeight || w !== window.innerWidth) {            window.close();            window.location = "about:blank";        }    }</script>

③ 利用Console.log2aV28資訊網——每日最新資訊28at.com

<script>     //控制臺打開的時候回調方法    function consoleOpenCallback(){        window.close();        window.location = "about:blank";        return "";    }    //立即運行函數,用來檢測控制臺是否打開    !function () {        // 創建一個對象        let foo = /./;        // 將其打印到控制臺上,實際上是一個指針        console.log(foo);        // 要在第一次打印完之后再重寫toString方法        foo.toString = consoleOpenCallback;    }()</script>

3.2.2 無限debugger反調試2aV28資訊網——每日最新資訊28at.com

① constructor2aV28資訊網——每日最新資訊28at.com

<script>    function consoleOpenCallback() {        window.close();        window.location = "about:blank";    }    setInterval(function () {        const before = new Date();        (function(){}).constructor("debugger")();        // debugger;        const after = new Date();        const cost = after.getTime() - before.getTime();        if (cost > 100) {            consoleOpenCallback();        }    }, 1000);</script>

② Function2aV28資訊網——每日最新資訊28at.com

<script>    setInterval(function () {        const before = new Date();        (function (a) {            return (function (a) {                return (Function('Function(arguments[0]+"' + a + '")()'))            })(a)        })('bugger')('de');        // Function('debugger')();        // debugger;        const after = new Date();        const cost = after.getTime() - before.getTime();        if (cost > 100) {            consoleOpenCallback2();        }    }, 1000);</script>

有大佬寫了一個庫專門用來判斷是否打開了開發者工具,可供參考使用:點擊查看>>2aV28資訊網——每日最新資訊28at.com

3.3 反反調試手段2aV28資訊網——每日最新資訊28at.com

3.3.1 禁用開發者工具2aV28資訊網——每日最新資訊28at.com

針對判斷是否打開開發者工具的破解方式很簡單,只需兩步就可以搞定。2aV28資訊網——每日最新資訊28at.com

① 將開發者工具以獨立窗口形式打開2aV28資訊網——每日最新資訊28at.com

② 打開開發者工具后再打開網址2aV28資訊網——每日最新資訊28at.com

3.3.2 無限debugger2aV28資訊網——每日最新資訊28at.com

針對無限debugger反調試,有以下破解方法2aV28資訊網——每日最新資訊28at.com

① 直接使用dubbger指令的,可以在Chrome找到對應行(格式化后),右鍵行號,選擇Never pause here即可。2aV28資訊網——每日最新資訊28at.com

② 使用了constructor構造debugger的,只需在console中輸入以下代碼后,點擊F8(Resume script execution)回復js代碼執行即可(直接點擊小的藍色放行按鈕即可)。2aV28資訊網——每日最新資訊28at.com

Function.prototype.cnotallow=function(){}

③ 使用了Function構造debugger的,只需在console中輸入以下代碼。2aV28資訊網——每日最新資訊28at.com

Function = function () {}

3.4 總結

JavaScript混淆加密使得代碼更難以被反編譯和分析,從而提高了代碼的安全性,攻擊者需要花費更多的時間和精力才能理解和分析代碼,從而降低了攻擊者入侵的成功率,但它并不能完全保護代碼不被反編譯和分析,如果攻擊者有足夠的時間和資源,他們仍然可以理解代碼并找到其中的漏洞,道高一尺,魔高一丈,任何客戶端加密混淆都會被破解,只要用心都能解決,我們能做的就是拖延被破解的時間,所以盡量避免在前端代碼中嵌入敏感信息或業務邏輯。2aV28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-51262-0.html前端 JS 安全對抗原理與實踐

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 如何使用 templ 在 Go 中編寫 HTML 用戶界面?

下一篇: 基于Spring Boot,一步步教你用Websockets和STOMP進行消息推送

標簽:
  • 熱門焦點
  • 7月安卓手機性能榜:紅魔8S Pro再奪榜首

    7月份的手機市場風平浪靜,除了紅魔和努比亞帶來了兩款搭載驍龍8Gen2領先版處理器的新機之外,別的也想不到有什么新品了,這也正常,通常6月7月都是手機廠商修整的時間,進入8月份之
  • 一加首款折疊屏!一加Open渲染圖出爐:罕見單手可握小尺寸

    8月5日消息,此前就有爆料稱,一加首款折疊屏手機將會在第三季度上市,如今隨著時間臨近,新機的各種消息也開始浮出水面。據悉,這款新機將會被命名為&ldquo;On
  • 谷歌KDD'23工作:如何提升推薦系統Ranking模型訓練穩定性

    谷歌在KDD 2023發表了一篇工作,探索了推薦系統ranking模型的訓練穩定性問題,分析了造成訓練穩定性存在問題的潛在原因,以及現有的一些提升模型穩定性方法的不足,并提出了一種新
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過這樣的問題:移動設備上有一個固定元素,當激活虛擬鍵盤時,該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認行為,在本文中,我們將探討這個問題、為什么會發生
  • 每天一道面試題-CPU偽共享

    前言:了不起:又到了每天一到面試題的時候了!學弟,最近學習的怎么樣啊 了不起學弟:最近學習的還不錯,每天都在學習,每天都在進步! 了不起:那你最近學習的什么呢? 了不起學弟:最近在學習C
  • 小紅書1周漲粉49W+,我總結了小白可以用的N條漲粉筆記

    作者:黃河懂運營一條性教育視頻,被54萬人&ldquo;珍藏&rdquo;是什么體驗?最近,情感博主@公主是用鮮花做的,火了!僅僅憑借一條視頻,光小紅書就有超過128萬人,為她瘋狂點贊!更瘋狂的是,這
  • 慕巖炮轟抖音,百合網今何在?

    來源:價值研究所 作者:Hernanderz&ldquo;難道就因為自己的一個產品牛逼了,從客服到總裁,都不愿意正視自己產品和運營上的問題,選擇逃避了嗎?&rdquo;這一番話,出自百合網聯合創
  • 華為HarmonyOS 4升級計劃公布:首批34款機型今日開啟公測

    8月4日消息,今天下午華為正式發布了HarmonyOS 4系統,在更流暢的前提下,還帶來了不少新功能,UI設計也有變化,會讓手機煥然一新。華為宣布,首批機型將會在
  • 聯想YOGA 16s 2022筆記本將要推出,屏幕支持觸控功能

    聯想此前宣布,將于11月2日19:30召開聯想秋季輕薄新品發布會,推出聯想 YOGA 16s 2022 筆記本等新品。官方稱,YOGA 16s 2022 筆記本將搭載 16 英寸屏幕,并且是一
Top 主站蜘蛛池模板: 汕尾市| 乌拉特后旗| 荥经县| 苍溪县| 东乌珠穆沁旗| 彰化市| 本溪市| 温州市| 台湾省| 京山县| 龙陵县| 聂拉木县| 镇雄县| 青阳县| 涪陵区| 和静县| 突泉县| 永平县| 桦南县| 昌平区| 长葛市| 涪陵区| 裕民县| 瑞金市| 东丽区| 长阳| 沾化县| 安多县| 昌乐县| 吉安市| 镇江市| 洪江市| 兴国县| 贵定县| 五大连池市| 郧西县| 西充县| 屏东市| 临桂县| 克山县| 乌鲁木齐县|