馮嘉潤 劉穎




關(guān)鍵詞:微信云數(shù)據(jù)庫;Java;SQL語句;SQL注入;多線程
0 引言
隨著微信小程序的不斷普及,小程序也成為眾多開發(fā)者的開發(fā)目標。而在開發(fā)小程序的同時,也會用到和小程序相對應(yīng)的微信云數(shù)據(jù)庫用來存儲小程序的數(shù)據(jù)信息[1],此時為了能夠更好地統(tǒng)計和處理這些數(shù)據(jù),通常會使用第三方的系統(tǒng)平臺來對這些數(shù)據(jù)進行處理。但是目前官方并未提供對微信云數(shù)據(jù)庫操作的Java工具類,這讓開發(fā)者在處理微信云中的數(shù)據(jù)需要自己手動去封裝這些接口[2]從而導(dǎo)致開發(fā)效率的降低。同時,開發(fā)過程可能也會由于開發(fā)者的疏忽導(dǎo)致編碼的安全性不高引發(fā)不必要的安全漏洞。
通過Java開發(fā)一款可以直接調(diào)用工具內(nèi)方法操作微信云數(shù)據(jù)庫的Jar包工具。用戶可以直接通過調(diào)用包內(nèi)的方法傳入對應(yīng)的SQL語句參數(shù)即可由工具代替用戶用已經(jīng)封裝好的方法請求微信云數(shù)據(jù)對應(yīng)的接口并獲取相應(yīng)的返回數(shù)據(jù),同時為了讓系統(tǒng)不受字符拼接導(dǎo)致的SQL 注入[3],工具會對用戶傳入的SQL語句進行特殊字符的過濾處理來保證系統(tǒng)的安全性[4]。
1 需求分析
該工具需要實現(xiàn)對云數(shù)據(jù)庫的操作,并打包成可以隨時調(diào)用的Java歸檔程序。為了能夠讓用戶更加簡單地使用該工具,用戶使用前需要提供微信云數(shù)據(jù)庫的資源ID、賬號、密鑰,由本工具的云數(shù)據(jù)庫初始化方法代替用戶對云數(shù)據(jù)庫的初始化來獲取數(shù)據(jù)庫的連接實例。對數(shù)據(jù)的操作一般有四種情況,即增刪改查操作,所以該工具需要提供對云數(shù)據(jù)庫增刪改查的方法,為了防止有其他的操作情況如事務(wù)、回滾等,本工具還需提供一個可以執(zhí)行任意SQL的方法來滿足用戶需求。同時為了保證系統(tǒng)的安全性和SQL語句的唯一語義性,需要對傳入的SQL語句進行安全性檢測與過濾。為了方便開發(fā)者能夠快速地定位自己的錯誤,工具需要提供對SQL語句執(zhí)行情況以及執(zhí)行結(jié)果的日志記錄功能以方便后續(xù)開發(fā)者能夠快速地分析和定位錯誤。
綜上所述,該工具主要提供了初始化微信云數(shù)據(jù)庫實例的方法,執(zhí)行增、刪、改、查和執(zhí)行任意SQL語句的方法和對SQL 語句的安全性校驗的方法以及SQL日志記錄的功能。
2 技術(shù)選型
該工具采用Java語言開發(fā),使用正則表達式對輸入的SQL語句進行特殊字符過濾以確保輸入的SQL語句是合法且不具有危險性的語句來防止SQL注入。工具使用到了Apache Jakarta Common 的子項目Apache HttpClient包作為底層發(fā)起網(wǎng)絡(luò)請求和獲得請求結(jié)果[5]的工具,由用戶輸入SQL語句之后調(diào)用本工具封裝好的網(wǎng)絡(luò)請求方法來獲得SQL語句執(zhí)行結(jié)果。執(zhí)行結(jié)果使用到了JSONObject類對其進行JSON的解析與格式化[6],JSON格式化完畢之后即可通過數(shù)組訪問的方法來獲取指定的執(zhí)行結(jié)果。最后使用Java 命令將該工具打包成可直接調(diào)用的Jar包[7],方便其他用戶使用該工具。
3 設(shè)計與實現(xiàn)
3.1 工具功能設(shè)計
根據(jù)需求分析,該工具需實現(xiàn)基本的增刪改查功能和任意SQL語句執(zhí)行方法來方便開發(fā)者直接調(diào)用。大致確認該工具功能分為“添加SQL語句執(zhí)行方法”“刪除SQL語句執(zhí)行方法”“更新SQL語句執(zhí)行方法”“查詢SQL語句執(zhí)行方法”“任意SQL語句執(zhí)行方法”“日志記錄”。確定該工具的功能結(jié)構(gòu)如圖1。
3.2 工具功能實現(xiàn)
為了達到通過請求微信云數(shù)據(jù)庫接口來操作數(shù)據(jù),主要需要實現(xiàn)以下功能:通過發(fā)起Apache HttpCli?ent包封裝的方法中的Post請求來發(fā)送對微信云數(shù)據(jù)庫初始化以及操作的請求。在底層為了提高SQL語句的執(zhí)行效率采用多線程的方式去發(fā)起網(wǎng)絡(luò)請求來執(zhí)行SQL語句。為保障系統(tǒng)數(shù)據(jù)的安全性,需要采取對SQL語句的安全性校驗。大致確認工具功能需要實現(xiàn)以下三點:“發(fā)起Post請求”“SQL語句安全性校驗”“多線程執(zhí)行SQL語句”。
3.2.1 發(fā)起Post 請求
該工具需要發(fā)起對微信云數(shù)據(jù)庫操作接口的網(wǎng)絡(luò)請求和接收返回數(shù)據(jù),此時需要用到Apache 的HttpCilent包請求微信云數(shù)據(jù)庫的操作接口,關(guān)鍵代碼如下:
當工具可以正常發(fā)起POST請求時,首先需要通過POST請求向微信云數(shù)據(jù)庫發(fā)送一個包含云數(shù)據(jù)庫ID、密鑰、賬號的驗證信息來獲取Token(身份臨時認證信息),擁有Token之后才能對數(shù)據(jù)庫進行操作。且該Token有效期只有兩個小時,那么在執(zhí)行對數(shù)據(jù)庫的操作之前需要對Token進行校驗,如果Token失效那么需要重新獲取Token,有效則直接發(fā)送操作數(shù)據(jù)庫的請求,關(guān)鍵代碼如下:
3.2.2 SQL 語句安全性過濾
數(shù)據(jù)庫是Web服務(wù)中非常重要的部分,許多重要的數(shù)據(jù)都存在于數(shù)據(jù)庫中。在Web漏洞中,SQL注入所占的比例是比較高的,且對服務(wù)的危害等級也是很高的,如果存在SQL注入漏洞可能會導(dǎo)致數(shù)據(jù)庫的信息泄露和影響應(yīng)用的正常使用。所以在使用SQL語句對數(shù)據(jù)庫進行查詢的時候需要確保所查詢的SQL語句是無危害的,不會導(dǎo)致除原本SQL語義的其他語句被執(zhí)行。本工具中的SQL語句采用微信云數(shù)據(jù)庫的語法結(jié)構(gòu),如果未對SQL語句進行安全校驗,那么原本的語義可能就會被攻擊者利用注入漏洞轉(zhuǎn)換為其他語義。
如原本語句為:"db. collection('admin'). where({username:'"+name+"'}).get()",傳入name參數(shù)即可查詢username為name的用戶。如果不對輸入的name參數(shù)安全校驗,那么輸入的name 如果為“小明",age:10"”,那么原語句的SQL語句就會變?yōu)椋?db.collection('admin').where({username: "小明",age: "10"}).get()",該語句的語義就會由查詢用戶名為小明的用戶信息變?yōu)椴樵冇脩裘麨樾∶髑夷挲g為10歲的用戶信息,原有的SQL語句的語義發(fā)生的轉(zhuǎn)變,這就是字符拼接導(dǎo)致的SQL注入。本工具采用字符過濾的方式可以有效地避免這種漏洞,關(guān)鍵代碼如下:
下面使用JUnit測試模塊測試該方法對輸入包含非法字符的SQL語句過濾效果,代碼如下:
3.2.3 多線程執(zhí)行SQL 語句
本工具對云數(shù)據(jù)庫進行操作的原理是通過請求微信云數(shù)據(jù)庫對應(yīng)的API 來實現(xiàn)的增刪改查操作。但網(wǎng)絡(luò)操作通常比較費時,所以為提高執(zhí)行效率,本工具在底層采用線程池的方式來發(fā)起網(wǎng)絡(luò)請求,從而實現(xiàn)在需要調(diào)用多線程直接進行調(diào)用,省去了創(chuàng)建多線程耗時的過程。關(guān)鍵代碼如下:
同時,執(zhí)行的SQL語句所返回的執(zhí)行結(jié)果在返回給用戶的同時也會輸出到控制臺方便開發(fā)者能夠快速地分析和定位錯誤,如圖4。
4 結(jié)束語
該工具使用Java開發(fā),提供了基本的微信云數(shù)據(jù)庫的SQL語句執(zhí)行功能、云數(shù)據(jù)庫初始化功能。讓開發(fā)者在對微信云數(shù)據(jù)庫的第三方開發(fā)中能夠更加簡單便捷。使用了線程池來提高SQL語句的執(zhí)行效率,在SQL執(zhí)行過程中對SQL語句進行了安全校驗確保SQL語句的語義一致以及云數(shù)據(jù)庫的安全。同時為了方便開發(fā)者能夠快速定位SQL語句,本工具會將每次執(zhí)行的SQL語句以及返回結(jié)果進行輸出記錄。