田紹東 徐萬明
摘要:Android是當前主流移動設備操作系統之一,基于Android系統的軟件也非常多,但Android系統上的軟件直接訪問網絡數據庫有一定的風險,該文對Android軟件訪問網絡數據庫技術進行研究,提出兩種更安全的Android訪問網絡數據庫代理技術。
關鍵詞:Android;網絡數據庫;遠程訪問
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2018)03-0014-02
目前基于Android系統的手機在市場占據較大的份額。據CodeForge網站發布2016年上半年《中國程序員調查報告》中顯示:在移動端市場,程序員們使用Android系統所占比例為79%,使用IOS系統的所占比例為18% 。Android系統下手機軟件大多數都要與網絡數據庫進行交互,從而實現軟件相關功能。但是當下基于Android環境下直接連接、訪問網絡數據庫的技術并不安全。因此研究Android環境下如何安全地訪問網絡數據庫的技術具有重要意義。
1 Android直接連接網絡數據的風險
相信許多Android程序員都知道在Android環境下連接數據的技術,簡單方式是使用JDBC(Java Database Connectivity,java數據庫連接)來連接數據庫。
JDBC是一種用于執行SQL語句的Java API,可以為多種關系數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,據此可以構建更高級的工具和接口,使數據庫開發人員能夠編寫數據庫應用程序[1]。
我們來見識一下使用JDBC連接數據的關鍵部分的代碼,以連接SQL數據庫為例。
Connection conn = DriverManager.getConnection
("jdbc:microsoft:sqlserver://host:port; DatabaseName=database","user","pwd");
上述代碼是通過Connection接口連接SQL數據庫,并在連接上傳送SQL指令,以實現相關數據庫操縱功能。分析getConnection方法中的參數,容易知道這里包含了訪問數據的類型,數據庫服務器的IP,端口號,數據庫名,訪問數據用戶名,訪問數據用戶的密碼等信息。那么如果這些信息被別有用心的人知道了會有什么后果?這就是Android直接連接網絡數據的風險!它可能暴露數據庫訪問的重要信息,可能帶來非常嚴重的后果。我們想想為什么支付寶、微信、電信翼支付等只給程序員編程的支付接口?而不是如上的訪問數據庫的方式。
2 代理訪問網絡數據技術
研究Android環境下訪問網絡數據庫的人員很多,他們結合前人的智慧提出了一些較好的訪問網絡數據庫的方法,如彭鳳凌提出了使用消息的模塊化交互結構系統來實現Android手機與遠程數據庫的交互[2];田佳影在文章中寫道使用Servlet進行數據交互,結合HttpClient組建來傳送數據,進而實現Android訪問遠程數據庫[3]。龔成瑩在其論文中提到Android遠程數據庫使用JSON格式交互信息的方便性[4]。徐萬明等提出了通過WebService實現了Android系統訪問SQLServer數據庫的例子[5]。
本人結合某Android項目研發,提出兩種安全訪問網絡數據庫的方法。
2.1 使用JSON數據格式與ASPX網頁交互操作訪問數據庫
在某Android項目研發過程中,考慮到安全性不能使用JDBC與數據庫直接連接進行數據操縱,在Android程序中通過httpClient對象與ASPX網頁進行數據交互,實現網絡數據交換,實現通過ASPX網頁代理訪問數據庫。本方法的產生是源于AJAX訪問ASPX網頁的技術。
下面將用戶登錄驗證模塊當示例展示通過ASPX網頁代理訪問數據庫的大致過程。Android端軟件設計主要過程如下:
第一步:建立httpClient;
HttpClienthttpClient = new DefaultHttpClient();
第二步:生成使用POST方法的請求對象;
String url = "http://ServerHost:Port/ReplyAjaxGetData.aspx";
HttpPosthttpPost = new HttpPost(url);
第三步:建立請求參數,并將之添加到HTTP請求體的對象;
HttpEntityrequestEntity = new UrlEncodedFormEntity(pairs);
httpPost.setEntity(requestEntity);
第四步:執行請求對象,獲取服務器返回的相應對象;
HttpResponse response = httpClient.execute(httpPost);
第五步:檢查相應的狀態是否正常,狀態碼的值是200表示正常;
if (response.getStatusLine().getStatusCode() == 200) {
第六步:從相應對象當中取出數據,放到entity當中;
HttpEntity entity = response.getEntity();
BufferedReaderreader = new BufferedReader(new InputStreamReader(entity.getContent()));
第七步:解析返回JSON數據,并判斷返回數據。
if(res0.equals("LoginOK"))
{//登錄成功
……}
else {//登錄失敗
……}}
ASPX網頁不用寫界面,只要在頁面的Page_Load事件中處理發送過來的請求即可。主要過程如下:
第一步:取得HTTP請求的參數;
stringcmdAction = Request["Action"];
第二步:判斷請求參數的值,可要據不同值做不同響應;
switch (cmdAction)
{ case“checklogin”:
//進一步讀取更詳細的請求參數
param1 = Request.Params["Table"];
param2 = Request.Params["id"];
//查詢數據庫……返回結果
result=……;
break;
case “”:……;break;}
第三步:將結果輸出到Android端。
Response.Write(result);
Response.End();
這種使用ASPX網頁代理訪問數據的方法相較其他方法而言比較簡單,也比較安全,將數據庫相關重要的信息隱藏在了Web服務器上,安全性由Web服務器的安全來決定,相比Android直接訪問數據要安全得多,在Android也只要提供訪問ASPX網頁的URL及相關請求參數,如果要對數據進行操縱,最好再加上驗證是否是合法用戶之后才能充許更新數據。
2.2 使用服務器端的中間層代理軟件訪問網絡數據庫
服務器端的中間層代理軟件(Agent Access Database Software,簡稱AADBS),是在某Android項目中開發的專為代理訪問數據庫的程序,它支持代理多個App軟件訪問自己專屬的數據庫,將多個不同的App軟件的數據放在AADBS的后方。它不僅支持Android訪問遠程網絡數據庫,其他嵌入式系統也可以。
AADBS的主要工作原理是接收移動端程序發送來的數據訪問請求,并找到相應數據庫進行代理訪問,將訪問結果返回給移動端程序,大體結構如圖1所示。
具體過程是:1) 由守護線程等待移動端程序發送過來的數據訪問連接,第一次連接的時候移動端程序發送三個參數,用戶名,密碼,移動程序名,移動程序名經查詢轉換為要訪問的數據庫名(在AADBS服務器上內置有數據庫,存儲移動程序名,數據庫IP地址,端口號,數據庫名,數據庫訪問用戶名,數據庫訪問密碼等信息)。經驗證用戶名與密碼成功后建立SESSION會話對象,進行數據訪問。2) 移動程序發送過來的數據流中傳送SQL指令被打包為一個消息放到傳入消息隊列,由消息處理線程從消息隊列中提取消息,傳送至對應的數據庫執行SQL指令。3) 將SQL執行結果打包放到傳出消息隊列。由消息發送線程通過之前建立的數據流將查詢結果返回給移動程序端。AADBS內部結構如圖2所示。
AADBS是用C#程序設計語言基于.net平臺開發的,具有很多優點:1)采用流行的面向對象技術將各對象進行封裝,使用軟件具有較好的軟件結構及較好的擴展性。2)將各消息處理模塊封裝成線程,大大提升軟件并發執行效率,使代理訪問數據庫服務能同時處理多個連接訪問請求,并且不因某個連接阻塞而影響其他的數據訪問連接。3)在服務器上可支持多種數據庫驅動程序,不受移動端系統環境的限制,可訪問多種類型的數據庫。4)在AADBS中加入日志記錄功能,記錄訪問者IP、執行的SQL指令等信息,可以實現數據訪問的追溯以及方便數據恢復等。
最后,在移動端程序中編寫類似于C#中的DataTable(數據表)類,DataRow(數據行)類等的類包,以及從數據流中提出數據的方法等。
3 結論
經實際使用環境的檢驗,App上線運行以來,以上兩種方法代理移動程序訪問網絡數據庫的響應速度令人滿意。重要的是數據庫的安全性得到了很好的解決,將數據庫訪問的信息成功地隱藏在了服務器上,當然這要做好服務器安全防護。使用服務器端的中間層代理軟件(AADBS)訪問數據庫的方式不僅將數據庫隱藏在了服務器的后方,還支持代理多個App的網絡數據庫訪問功能(只需在AADBS的數據庫中增加一行記錄)。
參考文獻:
[1] 彭鳳凌.安卓手機與數據庫交互系統的設計與實現[J].計算機工程與設計,2013,34(11):3907-3911.
[2] 田佳影.基于HttpClient的Android遠程數據庫訪問[J].電子世界.
[3] 龔成瑩,等.基于JSON的Android移動終端與PHP及MySQL數據通信[J].工業儀表與自動化裝置,2013(1):63-65.