微信小程序 安全包括(框架、功能模塊、賬戶使用)詳解
微信小程序 安全:
本文大白將從小程序的框架、功能模塊安全、賬戶使用安全方面進(jìn)行剖析,希望能為各位澤友帶來不一樣的認(rèn)知。
一.小程序框架概述
小程序抽象框架
視圖層
包含WXML、WXSS和頁面視圖組件。
WXML是一種類似XML格式的語言,支持?jǐn)?shù)據(jù)綁定、條件渲染、列表渲染、自定義模板、事件回調(diào)和外部引用
WXSS是一種類似CSS格式的語言,用于描述WXML的組件樣式,決定WXML中的組件如何顯示
組件是框架提供的一系列基礎(chǔ)模塊,是視圖層的基本組成單元,包含表單組件、導(dǎo)航、地圖、媒體組件等常用元素,如圖1說明當(dāng)前小程序支持的的視圖組件。
圖1-小程序視圖組件
邏輯層:
包含小程序注冊(cè)、頁面注冊(cè)和功能API。程序注冊(cè)代碼位于app.js,頁面框架注冊(cè)位于app.json,如圖2為官方示例小程序的app.js和app.json。功能API當(dāng)前包含網(wǎng)絡(luò)請(qǐng)求功能、文件處理功能、數(shù)據(jù)存儲(chǔ)功能、微信的開放接口功能等,詳見微信官方說明,如圖3所示。
圖2-小程序注冊(cè)代碼示例
圖3-小程序功能API示例
原生實(shí)現(xiàn)層
承載小程序依賴的具體操作,由微信APP支撐實(shí)現(xiàn),包括tbs內(nèi)核、JSAPI框架、初始化小程序配置、功能接口實(shí)現(xiàn)等,實(shí)現(xiàn)代碼主要位于com.tencent.mm.plugin.appbrand包,關(guān)聯(lián)功能有微信平臺(tái)原有的數(shù)據(jù)存儲(chǔ)能力、二維碼能力、網(wǎng)絡(luò)請(qǐng)求能力、支付能力等。
小程序調(diào)用框架
調(diào)用框架簡(jiǎn)圖
上圖主要說明小程序功能邏輯框架流程,由頂層的小程序?qū)崿F(xiàn)代碼(類似js),到微信底層支撐實(shí)現(xiàn)模塊的調(diào)用流程,通過微信JSAPI框架支撐頁面到本地實(shí)現(xiàn)的橋接調(diào)用。小程序緩存數(shù)據(jù)存放在Storage中,對(duì)應(yīng)文件為DB數(shù)據(jù)庫;小程序文件操作通過Hash機(jī)制進(jìn)行映射,并存儲(chǔ)在外部存儲(chǔ)空間。
承載小程序展示的組件是.plugin.appbrand.ui.AppBrandUI、.plugin.appbrand.ui.AppBrandUI1、.plugin.appbrand.ui.AppBrandUI2、.plugin.appbrand.ui.AppBrandUI3、.plugin.appbrand.ui.AppBrandUI4,五個(gè)組件實(shí)現(xiàn)邏輯相同,AppBrandUI1- AppBrandUI4繼承自AppBrandUI,圖5為每個(gè)承載小程序的Android組件定義。
圖5-承載每個(gè)小程序展示的組件定義
支持最多同時(shí)有五個(gè)小程序在加載運(yùn)行狀態(tài),每個(gè)小程序使用獨(dú)立進(jìn)程運(yùn)行,如果當(dāng)前開啟的小程序已位于緩存進(jìn)程中,則無需重新加載直接開啟(速度快),否則重新加載并替換(如果已有五個(gè)緩存進(jìn)程存在)存在時(shí)間最久的緩存進(jìn)程,若當(dāng)前未滿五個(gè)緩存進(jìn)程,則從未用進(jìn)程中隨機(jī)取得一個(gè)使用。下圖展示微信APP同時(shí)已開啟過五個(gè)小程序的對(duì)應(yīng)進(jìn)程。
圖6-小程序的進(jìn)程緩存示意圖
小程序初始化流程
小程序初始化流程包括開發(fā)者后臺(tái)控制關(guān)鍵配置和安全的配置更新流程。
后臺(tái)控制關(guān)鍵配置
小程序后臺(tái)控制的配置信息主要包括小程序名稱、圖標(biāo)、最大webview深度、最大請(qǐng)求數(shù)、請(qǐng)求合法域名列表、下載合法域名列表和上傳合法域名列表、socket合法域名列表以及APP包的基本信息等,動(dòng)態(tài)加載的配置信息相關(guān)代碼詳見【附錄1】
安全的配置更新流程
啟動(dòng)小程序檢查是否需從服務(wù)端更新最新配置,如果需更新則下載最新配置到本地APP,如圖7說明當(dāng)前設(shè)備上已有使用的9個(gè)小程序的初始化數(shù)據(jù),以二進(jìn)制文件形式(后綴為.wxapkg)存放在APP目錄下。在初始化階段完成小程序的關(guān)鍵屬性更新和配置,此部分屬性配置完全由后端配置控制,在更新傳輸和本地存儲(chǔ)被惡意篡改的可能性極低,提取配置信息的實(shí)現(xiàn)代碼詳見【附錄2】。
圖7-小程序的初始化數(shù)據(jù)文件示意圖綜上內(nèi)容,大白為澤友們介紹了小程序的框架部分,接下來,大白要介紹的就是小程序核心
功能模塊安全分析,繼續(xù)圍觀哦!
二.小程序功能模塊安全
功能模塊安全大白將分為6小部分分析介紹,分別是:
1、網(wǎng)絡(luò)傳輸安全
2、數(shù)據(jù)存儲(chǔ)安全
3、文件存儲(chǔ)安全
4、掃碼二維碼安全
5、微信開放接口安全
6、小程序釣魚風(fēng)險(xiǎn)
7、泄露數(shù)據(jù)到微信隱患
下面我們先看一下小程序的網(wǎng)絡(luò)傳輸安全。
網(wǎng)絡(luò)傳輸安全
支持發(fā)起通用請(qǐng)求、文件上傳下載、WebSocket通訊機(jī)制。
Https校驗(yàn)安全
通用request網(wǎng)絡(luò)請(qǐng)求僅支持采用https,處理請(qǐng)求的接口位于com.tencent.mm.plugin.appbrand.g.c中,包含url校驗(yàn)、域名校驗(yàn)、發(fā)起請(qǐng)求和處理響應(yīng)結(jié)果。圖8圖9分別為官方正式DEMO和某銀行APP請(qǐng)求包示意圖。
圖9-某銀行APP request功能請(qǐng)求包
Https校驗(yàn)采用類似瀏覽器的策略,通過系統(tǒng)原生的URL.openConnection()方式請(qǐng)求,證書校驗(yàn)的策略為校驗(yàn)公鑰證書的根證書是否在合法CA列表憑證中。因此自簽名證書無法使用;針對(duì)特定終端設(shè)備,即是校驗(yàn)公鑰證書的根證書是否在受信任的憑據(jù)中,在設(shè)備被惡意安裝代理根證書的前提下,存在被中間人攻擊的風(fēng)險(xiǎn)。Request網(wǎng)絡(luò)請(qǐng)求實(shí)現(xiàn)代碼詳見【附錄3】。
通過域名控制可訪問的url
由后臺(tái)配置小程序支持的域名,僅可訪問已配置域名的url,校驗(yàn)過程會(huì)將配置的域名先下載到本地,然后每次請(qǐng)求時(shí)本地做域名檢查通過后才發(fā)起。域名檢查代碼實(shí)現(xiàn)詳見【附錄4】,圖10展示了域名不匹配進(jìn)行錯(cuò)誤請(qǐng)求的示例。
圖10-小程序域名控制檢查
此外,對(duì)于通用request請(qǐng)求平臺(tái)會(huì)進(jìn)行請(qǐng)求超時(shí)控制(當(dāng)前應(yīng)該是5s),當(dāng)請(qǐng)求超過5s即會(huì)被中斷(文件上傳操作也有超時(shí)中斷控制),超時(shí)后請(qǐng)求將被拋掉。
網(wǎng)絡(luò)下載安全
同樣僅支持從含有已配置域名的url下載資源,不是走h(yuǎn)ttp/https協(xié)議。下載成功后臨時(shí)存放,通過自定義協(xié)議wxfile進(jìn)行訪問,映射到SD卡上目錄 /sdcard/tencent/MicroMsg/wxafiles/wx_id/tmp_[hash_value]。
文件上傳安全
上傳至小程序合法域名下的服務(wù)器上,并保存臨時(shí)文件在SD卡的文件存儲(chǔ)區(qū)域/sdcard/tencent/MicroMsg/wxafiles/wx_id/tmp_[hash_value]。
圖12-文件上傳示意圖
小程序外鏈url規(guī)范
小程序在微信的生態(tài)下運(yùn)行,不開放給個(gè)人使用(需要企業(yè))。在小程序中不允許調(diào)整到外部網(wǎng)站,也不允許放鏈接。同時(shí)微信在小程序發(fā)布前會(huì)對(duì)小程序進(jìn)行審核。
數(shù)據(jù)存儲(chǔ)安全
以(key,value)形式存放在本地緩存,將小程序需要存儲(chǔ)的key/value數(shù)據(jù)直接存儲(chǔ)到Storage DB緩存,小程序進(jìn)行數(shù)據(jù)保護(hù)需要自行做加密處理。數(shù)據(jù)存儲(chǔ)在本地DB,微信APP會(huì)對(duì)DB數(shù)據(jù)整體做本地加密保護(hù),所以小程序本地存儲(chǔ)數(shù)據(jù)的安全性依賴于微信數(shù)據(jù)庫加密方案的安全,策略與EnMicroMsg.db類似,如下圖所示。
圖14-本地?cái)?shù)據(jù)存儲(chǔ)示意
文件存儲(chǔ)安全
文件保存在SD卡/sdcard/tencent/MicroMsg/wxafiles/wx_id/目錄下,通過wxfile://協(xié)議指向SD卡目錄下的文件。
存放SD卡的文件有做完整性校驗(yàn),無法被篡改。首先,最終存儲(chǔ)的文件名是:對(duì)稱加密(文件流內(nèi)容Alder32校驗(yàn)和|原始文件名)生成的,最終文件名和文件內(nèi)容會(huì)通過自校驗(yàn)判斷完整性;其次,本地緩存是通過HASH映射查找文件。所以即使能破解文件名和文件內(nèi)容,繞過文件自身簽名校驗(yàn),篡改為攻擊者的偽造文件,小程序APP也無法映射到該偽造文件進(jìn)行使用。
掃碼二維碼安全
掃碼功能(wx.scanCode)依賴微信APP的原生的掃碼功能;生成小程序特定頁面的直達(dá)二維碼,依賴于ACCESS_TOKEN,而ACCESS_TOKEN是通過小程序(公眾號(hào))私有的APPID和appsecret請(qǐng)求得到,攻擊者無法獲知到該信息偽造生成二維碼。
微信開放接口安全
用戶信息獲取,包含以下信息:
接口返回的明文數(shù)據(jù)會(huì)進(jìn)行簽名校驗(yàn),需要依賴登錄session_key;接口返回的敏感數(shù)據(jù)會(huì)通過密文返回,解密算法依賴登錄session_key。攻擊者無法獲知用戶的session_key進(jìn)行破解,竊取用戶數(shù)據(jù)。
此外分享、客服消息、模板消息中輸入的內(nèi)容僅會(huì)以文本形式輸出;模板消息會(huì)將數(shù)據(jù)通過https傳輸?shù)椒?wù)器,而后推送到客戶微信服務(wù)通知;微信支付功能繼承微信平臺(tái)原有的功能,安全性較為可靠。
開放平臺(tái)大部分功能會(huì)先通過wx.login獲得code;然后使用該code換取openid;以此openid進(jìn)行既定的微信功能操作,比如發(fā)送模板消息推送、發(fā)起微信支付等。
圖15-開放平臺(tái)發(fā)布模板請(qǐng)求示意圖
小程序釣魚風(fēng)險(xiǎn)
微信小程序以唯一appid標(biāo)識(shí)身份,不同小程序擁有不同的appid。如果惡意開發(fā)者偽造流行的小程序APP,如美團(tuán)、大眾點(diǎn)評(píng),制作一個(gè)仿冒的微信小程序,且使用不同的appid,有可能繞過微信的審核流程發(fā)布到市場(chǎng)。小白用戶如無辨識(shí)能力,極可能被釣魚受騙。但由于小程序無法嵌入url跳轉(zhuǎn),同時(shí)有訪問域名的控制,使得釣魚風(fēng)險(xiǎn)在一定程度上減輕。小程序釣魚風(fēng)險(xiǎn)依賴于微信平臺(tái)的發(fā)布審核、監(jiān)管控制。
泄露數(shù)據(jù)到微信隱患
微信小程序的網(wǎng)絡(luò)請(qǐng)求通過微信APP實(shí)現(xiàn)轉(zhuǎn)發(fā),微信平臺(tái)可能可以獲取到小程序的所有網(wǎng)絡(luò)請(qǐng)求和存儲(chǔ)數(shù)據(jù),因此對(duì)于小程序業(yè)務(wù)敏感的數(shù)據(jù),建議由小程序再做一層保護(hù);小程序的操作軌跡日志會(huì)加密傳送到騰訊TBS后臺(tái),如下圖所示。
圖16-操作軌跡日志監(jiān)控上傳
三.小程序賬戶使用安全
通過目前使用體驗(yàn),發(fā)現(xiàn)當(dāng)前存在三種賬戶形式:
方式一:
通過wx.getUserInfo獲取的微信用戶信息,以openid標(biāo)識(shí)一個(gè)用戶應(yīng)用到小程序;
方式二:
通過公眾平臺(tái)appid+appsecret+code,換取session_key/openid,并生成小程序第三方session,在小程序的服務(wù)器維護(hù)第三方session和微信session_key/openid的關(guān)聯(lián);客戶端使用第三方session進(jìn)行請(qǐng)求;
方式三:
通過小程序內(nèi)部自實(shí)現(xiàn)的登錄模塊,如手機(jī)號(hào)+動(dòng)態(tài)驗(yàn)證碼登錄
方式一是一種弱賬戶體系設(shè)計(jì),小程序本身無法獲得微信用戶的標(biāo)識(shí)信息,如手機(jī)號(hào)、身份證或銀行卡,依賴于微信開放平臺(tái)接口可以提供的用戶信息,詳見2.5節(jié),一般會(huì)在頁面上展示微信用戶昵稱和頭像,如下圖17所示。
圖17-使用微信信息登錄
方式二和方式三是強(qiáng)賬戶體系,方式二類似微信公眾號(hào)的授權(quán)機(jī)制,通過小程序獲得的code和微信用戶基本信息,到第三方服務(wù)器獲取訪問的token(第三方session),第三方服務(wù)器維護(hù)用戶使用的session與微信session_key/openid的關(guān)聯(lián)關(guān)系。圖18為微信官方提供的登錄實(shí)現(xiàn)時(shí)序圖,圖19為某小程序授權(quán)登錄的請(qǐng)求過程。
圖18-官方提供的授權(quán)登錄實(shí)現(xiàn)方案
以上第一個(gè)請(qǐng)求通過code和微信基本用戶信息到第三方服務(wù)器換取token,而后的請(qǐng)求通過token請(qǐng)求用戶個(gè)人數(shù)據(jù),如團(tuán)購代金券使用歷史記錄。方式二不能將微信公眾平臺(tái)的appsecret或者session_key(屬于敏感信息)傳遞到客戶端,否則可能導(dǎo)致安全攻擊。方式三屬于小程序自身實(shí)現(xiàn)方式,依賴自身實(shí)現(xiàn)的安全性,與微信平臺(tái)無關(guān)。
四.總結(jié)
說了這么多,大白也該總結(jié)一下了,大致如下8點(diǎn):
1、框架上繼承了微信成熟的JSAPI框架和底層的TBS瀏覽器內(nèi)核;
2、小程序的關(guān)鍵信息完全由后臺(tái)控制進(jìn)行配置,如可訪問的域名信息;
3、通用網(wǎng)絡(luò)傳輸使用Https,并對(duì)訪問域名進(jìn)行校驗(yàn)控制,無法抵御攻擊者在本地安裝代理證書實(shí)施中間人攻擊的威脅;
4、本地?cái)?shù)據(jù)存儲(chǔ)采用(KEY,VALUE)形式存放在DB,數(shù)據(jù)的保護(hù)繼承了微信的數(shù)據(jù)庫加密防護(hù)策略;
5、本地文件存儲(chǔ)采用HASH映射機(jī)制進(jìn)行文件定位,文件存儲(chǔ)在外部存儲(chǔ),本身通過自定義算法實(shí)現(xiàn)完整性校驗(yàn);
6、存在仿冒釣魚小程序的可能,依靠于微信平臺(tái)的審核監(jiān)管能力;
7、針對(duì)特定小程序,由于是在微信平臺(tái)生態(tài)中運(yùn)行,小程序自身仍需對(duì)敏感數(shù)據(jù)進(jìn)行安全防護(hù);
8、小程序登錄體系可以依賴微信接口和公眾號(hào)平臺(tái),也可以由小程序自行實(shí)現(xiàn)。前者需要根據(jù)微信平臺(tái)的安全規(guī)范實(shí)施,后者則由小程序自行控制安全性。
五.附錄
下面大白補(bǔ)充一下上述文中4個(gè)附錄內(nèi)容:
附錄1:小程序初始化后臺(tái)配置信息
a target="_blank" >附錄2:更新并提取后臺(tái)配置信息邏輯
附錄3:request網(wǎng)絡(luò)請(qǐng)求實(shí)現(xiàn)
附錄4:網(wǎng)絡(luò)請(qǐng)求域名校驗(yàn)
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Fabric.js 實(shí)現(xiàn)變換視窗示例詳解
這篇文章主要為大家介紹了Fabric.js 實(shí)現(xiàn)變換視窗示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09ECharts框架Sunburst拖拽功能實(shí)現(xiàn)方案詳解
這篇文章主要為大家介紹了ECharts框架Sunburst拖拽功能實(shí)現(xiàn)方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12詳解Anyscript開發(fā)指南繞過typescript類型檢查
這篇文章主要為大家介紹了詳解Anyscript開發(fā)指南繞過typescript類型檢查,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09微信小程序 網(wǎng)絡(luò)請(qǐng)求(GET請(qǐng)求)詳解
這篇文章主要介紹了微信小程序 網(wǎng)絡(luò)請(qǐng)求(GET請(qǐng)求)詳解的相關(guān)資料,需要的朋友可以參考下2016-11-11在JavaScript實(shí)例對(duì)象中改寫原型方法詳情
這篇文章主要介紹了在JavaScript實(shí)例對(duì)象中改寫原型方法的一下相關(guān)資料,需要的效果版可以參考一下文章詳細(xì)內(nèi)容,希望對(duì)你有所幫助2021-10-10