# 安全指引
## 開發原則與注意事項
本文檔整理了部分小程序開發中常見的安全風險和漏洞,用于幫助開發者在開發環節中發現和修復相關漏洞,避免在上線后對業務和數據造成損失。開發者在開發環節中必須基于以下原則:
1. 互不信任原則,不要信任用戶提交的數據,包括第三方系統提供的數據,必要的數據校驗必須放在后臺校驗。
2. 最小權限原則,代碼、模塊等只擁有可以完成任務的最小權限,不賦予不必要的權限。
3. 禁止明文保存用戶敏感數據。
4. 小程序代碼(不包括云函數代碼)跟傳統 Web 應用的前端代碼類似,可被外部獲取及進行反混淆,重要業務邏輯應放在后臺代碼或云函數中進行。
5. 后臺接口調用以及云函數調用,必須進行有效的身份鑒權。
## 通用
### 接口鑒權
接口鑒權是指后臺接口(包括自建后臺接口與云函數)在被調用時需要對本次接口調用進行權限校驗,否則容易發生越權行為。如商品刪除接口,后臺在收到請求時應當校驗調用者的身份信息(如 openid、 ip 地址、開發者自定義的登錄信息等),只有指定用戶才可以通過校驗進行刪除。
越權通常分為平行越權和垂直越權:
* 平行越權?
平行越權是指相同角色之間的越權。 A1、 A2 都是普通用戶, A1 通過請求后臺接口 userinfo.php?id=A1 來獲取用戶 A1 自己的信息,如果 userinfo.php 沒有進行權限校驗,用戶 A1 把請求改為 userinfo.php?id=A2 便可以獲取到 A2 用戶的信息,造成 A2 用戶信息的泄露。
* 垂直越權?
垂直越權是指不同角色之間的越權。 B1 是管理員, B2 是普通用戶,管理員 B1 通過請求后臺接口 getalluserinfo.php 可以獲取所有注冊用戶的信息,如果 getalluserinfo.php 沒有進行權限校驗, B2 用戶也可以請求 getalluserinfo.php 來獲取所有注冊用戶的信息,出現越權行為。
開發建議:
1. 敏感數據、能力相關接口需要在后臺進行鑒權。通常可校驗 openid、 IP 地址、自定義登陸態等信息。
2. 鑒權邏輯應放在后臺進行,不應在小程序前端以隱藏頁面、隱藏按鈕等方式來代替。參照原則4。
3. 鑒權代碼示例(僅供參考)
1. 自建后臺鑒
~~~
function actionDelete(){
$item_id = $_POST["item_id"];
$openid = $_POST["openid"];
$ip = $_SERVER['REMOTE_ADDR'];
$user_role = $_SESSION["user_role"];
if ($openid === "xxx" &&
$ip === "192.168.0.101" &&
$user_role === "admin") {
// 進行刪除操作
// ...
return 0;
} else {
// 記錄非法請求
// ...
return -1;
}
}
~~~
2. 云函數接口鑒權
~~~
exports.main = async (event, context) => {
const { OPENID, APPID, UNIONID } = cloud.getWXContext();
if (OPENID === "xxx") {
// 進行刪除操作
// ...
} else {
// 記錄非法請求
// ...
}
}
~~~
### 代碼管理與泄漏
1. 當使用 git、 svn 等版本管理工具時,會產生 .git 等目錄。某些編輯器或軟件也會在運行過程中生成臨時文件。若這些目錄或文件被帶到生產環境,則可能發生源碼泄漏。
2. 使用[小程序代碼管理平臺](https://git.weixin.qq.com/users/authorize#wechat_redirect)或 github 等第三方平臺時需要注意項目權限,不要公開敏感、內部項目。
開發建議:
1. 備份文件和版本管理工具產生的文件不要同步到 Web 目錄下。
2. 禁止外部訪問 .git 等目錄與文件。
3. 在[小程序代碼管理平臺](https://git.weixin.qq.com/users/authorize#wechat_redirect)等管理平臺內配置適當的訪問權限。
## 小程序
### 信息泄露
敏感信息是指一旦泄露可能會對開發者的業務、合作伙伴和用戶帶來利益損害的數據,包括但不限于**帳號 Appsecret、特權帳號信息、后臺加密密鑰、登錄賬戶密碼、用戶身份證號、手機號、銀行卡號等。**
開發建議:
1. 敏感信息不應以明文、注釋、可逆的編碼方式(如 base64)、不安全散列函數(如 MD5、 SHA1)等形式出現在小程序文件內。
2. 部分敏感信息如用戶的銀行卡號、手機號等需要用于展示的,需要進行脫敏處理。常用脫敏規范如下:?
| 敏感信息類型 | 展示樣例 |
| --- | --- |
| 姓名 | 名字只有兩個字,對第一個字打碼,如:\*三。 多于兩個字,只保留第一個和最后一個,其余都打碼,如:王\*四、歐\*\*五 |
| 身份證 | 只顯示第一位和最后一位,如:3\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*1 |
| 手機號 | 除去手機國際碼后,手機號位數不少于10位時,只顯示前三位和最后兩位,如:156\*\*\*\*\*\*77。手機號位數少于10位時,只顯示前兩位和后兩位,如:12\*\*\*\*\*89。國家碼可以完全顯示。 |
| 銀行卡 | 只顯示最后4位,如:\*\*\*\*\*\*\*\*\*\*\*\*1234 |
3. 如果小程序存在敏感信息泄露的問題,微信開放平臺將有可能下架該小程序,并暫停該小程序的相關服務。## 后臺(包括云函數與自建后臺)
### 注入漏洞
注入漏洞(SQL、 命令等)通常指用戶繞過后臺代碼限制,直接在數據庫、 shell 內執行自定義代碼。
常見的注入漏洞有:
#### SQL 注入
SQL 注入是指 Web 程序代碼中對于用戶提交的參數未做有效過濾就直接拼接到 SQL 語句中執行,導致參數中的特殊字符打破了 SQL 語句原有邏輯,黑客可以利用該漏洞執行任意 SQL 語句。
**開發建議:**
1. 使用數據庫提供的參數化查詢來進行數據庫操作,不允許直接通過拼接字符串的方式來合成 SQL 語句。
2. 如果存在部分情況需要通過拼接的方式來合成 SQL ,拼接的變量必須要經過處理:對于整數,需要判斷變量是否為整數類型。對于字符串,需要對單引號、雙引號等做轉義處理。
3. 避免 Web 應用顯示 SQL 的報錯信息。
4. 保證 Web 應用里每一數據層的編碼統一。
#### 命令注入
命令注入漏洞是指 Web 應用未對用戶可控參數進行有效過濾,攻擊者可以構造惡意參數拼接到命令上來執行任意命令。
**開發建議:**
* 對用戶輸入的數據(如 ;、|、&等)進行過濾或轉義。
### 弱口令
弱口令指管理后臺的用戶名密碼設置得較為簡單或者使用默認帳號。攻擊者可以通過登錄這些帳號修改后臺數據或進行下一步的入侵操作。
**開發建議:**
1. 后臺服務禁用默認帳號,修改后臺弱口令。
2. 敏感服務增加二次驗證機制,如短信驗證碼、郵箱驗證碼等。
### 文件上傳漏洞
文件上傳漏洞是指 Web 應用允許用戶上傳指定文件,但未對文件類型、格式等做合法性校驗,導致可以上傳非預期格式的文件。
**開發建議:**
* 正確解析上傳文件的文件類型,通過白名單的方式限制可上傳的文件類型。
### 文件下載
文件下載漏洞是指 Web 應用允許用戶通過指定路徑和文件名的方式來下載對應的文件,但未正確限制可下載文件所在的目錄范圍,導致預期范圍外的文件被下載泄露。
**開發建議:**
1. 正確限制可下載文件所在的目錄范圍
2. 通過指定文件 id 的方式來查找下載對應的文件
### 目錄遍歷
目錄遍歷是指由后臺服務對用戶輸入驗證不足或配置不嚴謹導致的服務器目錄內容泄漏。外部可能通過目錄遍歷獲取系統文件、后臺代碼等敏感文件。
**開發建議:**
1. web 服務配置
1. 服務端禁止展示目錄
2. 設置目錄訪問權限
3. 在每個目錄下放置一個空的 index.html 頁面
2. web 應用代碼
嚴格檢查文件路徑參數,限定文件的范圍
### 條件競爭
條件競爭比較常見的例子是攻擊者通過并發 https 請求而達到多次獲獎、多次收獲、多次獲贈等非正常邏輯所能觸發的效果。
* 漏洞代碼示例?
~~~
// 從DB里查詢該用戶剩余獲獎次數,初始值為1
int remain_times = SelectRemainTimes();
if(remain_times > 0){
EarnRewards(); // 用戶獲得獎勵
ClearRemainTimes(); // 在DB里把該用戶的剩余獲獎次數清零
}
~~~
開發者的設計本意是只允許用戶獲得一次獎勵,但當出現并發請求時,有可能出現請求 A 和請求 B 都剛好執行完第2行代碼的情況,此時兩個請求的 remain\_times 都為1,也就是可以通過第4行代碼的判斷,獲得兩次獎勵。
**開發建議:**
* 對關鍵(完整)邏輯加鎖操作或把關鍵邏輯以隊列任務的形式去進行處理。
- 惠惠軟件-開發自助學習系統
- 一.微信公眾號(服務號)申請流程
- 二.申請所需提前準備資料
- 三.認證微信公眾號:申請微信小程序流程
- 四.微信小程序安裝和開發環境
- 五.微信小程序如何上傳、提交審核、發布操作
- 六.微信小程序開發教程手冊
- 0.1微信小程序 小程序簡介
- 0.2微信小程序 開始第一步
- 0.3微信小程序 小程序代碼構成
- 0.4微信小程序 小程序宿主環境
- 0.5微信小程序 小程序協同工作和發布
- 0.6微信小程序 目錄結構
- 0.7微信小程序 全局配置
- 0.8微信小程序 頁面配置
- 0.9微信小程序 sitemap配置
- 0.10微信小程序 場景值
- 0.11微信小程序 注冊小程序
- 0.12微信小程序 注冊頁面
- 0.13微信小程序 頁面生命周期
- 0.14微信小程序 頁面路由
- 0.15微信小程序 模塊化
- 0.16微信小程序 API
- 0.17微信小程序 運行環境
- 0.18微信小程序 JavaScript支持情況
- 0.19微信小程序 運行機制
- 0.20微信小程序 更新機制
- 0.21微信小程序 廣告·Banner 廣告
- 0.22微信小程序 安全指引·開發原則與注意事項
- 0.23微信小程序 調試
- 0.24微信小程序 啟動性能
- 0.25微信小程序 運行時性能
- 0.26微信小程序 性能分析工具
- 0.27微信小程序 體驗評分
- 八.小程序的美工
- 8.1圖片大小
- 8.2顏色代碼
- 8.3小程序的美工技巧
- 九.微信小程序-定制開發
- 十.微信支付申請流程
- 十一.小程序支付對接流程
- 十二.微信小程序使用中常見問題匯總
- 十二.小程序開發中遇到的問題—匯總
- 十四.小程序問題及解決
- 十五.網站開發定制
- 1.開發定制流程
- 2.搭建網站的過程
- 3.做網站基本費用
- 4.服務器選什么系統更好?
- 十六.常用工具、軟件網站推薦