毋世曉
摘要:用戶使用表單頁面進行交互時,系統對關鍵的SQL操作語句進行預處理,可以防止SQL注入。經過預處理的數據查詢語言比普通意義上的SQL語句更加安全可靠。本文以留言板系統為例,對該系統的功能里涉及登陸、注冊、添加留言的頁面代碼SQL語句部分進行了預處理,借以保證用戶信息安全。
關鍵詞:QL預處理;留言板;SQL注入引言:根據Imperva公司的“監測黑客論壇:ADC每月網絡攻擊分析(2012年10月)”報告顯示,在黑客論壇,最常被討論的是拒絕服務(DoS)/分布式拒絕服務(DDoS)攻擊和SQL注入。根據安全云托管公司FireHost公司9月份發布的報告顯示,在2012年的前兩個季度,SQL注入攻擊上升了69%。SQL注入可以通過判斷Web環境是否可以進入,進而輸入特殊的語句判斷數據庫的類型、判斷數據庫的用戶名和密碼,最終進入后臺管理獲取用戶信息,這對Web安全威脅很大。
本文通過一個詳細的案列來介紹如何在一個系統中利用SQL 預處理語句防范SQL注入。SQL預處理語句實現的過程就是內部轉義的過程,它將一些需要轉義的字符進行轉義,對SQL語句進行預處理, 將SQL語句進行內部編譯并優化,所需要的查詢只需要被解析一次,使用的資源更少,執行速度更快,當然也更安全。
系統包括5個模塊:登陸、注冊、添加留言、查看留言,刪除留言。前四個模塊是針對用戶的,后一個模塊是針對管理人員的。
文章的第一部分是引言,第二部分介紹論文的技術背景,第三部分介紹系統的詳細設計,第四部分是實現結果,第五部分是總結,第六部分是參考文獻。
一、技術背景
本系統使用JSP+JavaBean+Access的方式來開發留言板系統[1]。所需要的軟件涉及:Apache Tomcat 6.0,jdk1.7.0_17,Microsoft Access 2000, Macromedia Dreamweaver 8, Jcreator LE
5.00,在所有的軟件安裝成功以后需要配置2個環境變量:在我的電腦-->屬性-->高級-->環境變量里,系統變量里選中Path變量雙擊打開,在變量名的最后一個分號后面加入:C:Program FilesJavajdk1.7.0_17in;(前提是JDK是默認安裝的),并在系統變量里新建變量名為ClassPath變量值為C:
Program FilesJavajdk1.7.0_17lib的系統變量,配置Java所需的運行環境,是因為JSP頁面里會涉及部分Java代碼[2]。
在這些軟件中,JDK保證JSP中J(Java)的運行環境,Tom
cat充當JSP中S(Server)服務器的功能,Dreamweaver提供
JSP中P(Page)的編輯環境。 可以在Jcreator中查看Java文件,并將Java文件編譯成.class文件,.class文件都被部署在C:Program FilesApache Software FoundationTomcat 6.0webappsROOTWEB-INFclassesmypackage文件夾下,在JSP文件中通過import導入這些class文件。
系統共使用10個文件,其中包括2個class文件(Access
ConnBean.class, MyUtil.class),6個jsp文件(Login.jsp, liuyan.
jsp, writely.jsp, viewly.jsp, writelyd.jsp, delete.jsp),2個html頁面(1.html, 2.html)。
AccessConnBean.class 文件完成連接數據庫的功能,MyU
til.class文件完成GB2312碼到Unicode碼的轉換,因表單輸入頁面是GB2312碼,而JSP頁面的字符串是以Unicode顯示的。
因為涉及將注冊信息及留言信息寫入數據庫,系統設計了2個Access數據庫——liuyan.mdb和user_info數據庫。JSP訪問Access數據庫的方式是JDBC-ODBC[3]。數據庫的詳細設計將在第三章介紹。
二、留言板系統
(一)系統功能。本系統共包括2個子系統(用戶登陸和留言系統),共完成5個功能:(1)登陸功能。登陸的用戶必須是數據庫里的用戶,如果不是已經注冊的用戶,則需要點擊注冊。成功則進入注冊界面,失敗留在當前頁面。(2)注冊功能。單輸入自己的用戶名、密碼、郵箱等信息,并通過writelyd.jsp頁面寫入數據庫。(3)查看留言。已經存在的用戶登錄進入系統以后可以查看留言板信息。(4) 添加留言。用戶輸入正確的用戶名和密碼以后可以進入liuyan.jsp頁面添加留言,留言內容會通過write
ly.jsp頁面添加到數據庫。(5)刪除留言。該模塊需要用戶登錄,且必須知道管理員的用戶名和密碼,在2.html輸入要刪除的留言者姓名,通過delete.jsp頁面進行處理,即可刪除該留言者的留言。
(二)數據庫設計。留言版系統采用Access數據庫,因為該數據庫設計比較簡單,只存放用戶注冊信息及留言信息,涉及了數據庫的插入,查詢,刪除等操作。
該系統包含兩個數據庫: user_info數據庫和liuyan數據庫,這兩個數據庫各自包含同名的一個表,user_info表包含us
er_id,password, email, name, sex 5個字段。Liuyan表包含xm,
email, ly, url 4個字段。
(三)預處理實現 。留言板系統涉及用戶信息的有以下3個頁面:Login.jsp, writely.jsp, writelyd.jsp。他們分別完成的功能是使用用戶名和密碼登陸、將注冊信息寫入數據庫、將留言信息寫入數據庫。這3個頁面都是處理Web表單提交的信息,涉及信息的內容包括用戶的用戶名,密碼,郵箱,留言內容,姓名,地址等。我們使用預處理語句處理數據庫的查詢、插入等操作, 在防止SQL注入的同時還可以提高系統性能。
以Login.jsp登錄頁面為例,我們給出關鍵代碼來給大家作對比,先給出普通版本的:
AccessBean.OpenConn();
String sql = “select user_id,password from user_info where
user_id=‘”+userId+” and password=‘“+password+“”;
ResultSet rs = AccessBean.executeQuery(sql);
其中AccessBean是AccessConnBean的一個別名,我們在
usebean中簡化了這個類名,這個類用來連接Access數據庫,根據數據查詢返回結果集ResultSet。
其次我們給出PrepareStatement版本的:
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);con=
DriverManager.getConnection(“jdbc:odbc:user_info“,” “,””);
String sql = select user_id,password from user_info where
user_id=‘“+userId+” and password=“+password+”;
PreparedStatement pstmt=con.prepareStatement(sql);
ResultSet rs=pstmt.executeQuery();
在這個版本中,第一句是連接JDBC-ODBC驅動,第二句連接user_info用戶注冊數據庫,第三句是SQL查詢語句,第四句將SQL語言進行預編譯,并通過預編譯語句對象執行查詢,將數據結果返回給ResultSet。
使用PreparedStatement預處理語句可以將SQL語言進行預編譯,預處理可以自動檢查已經綁定好的變量,同時強制轉換這些變量使之與底層數據庫驅動相匹配,它會忽略掉一些惡意的字符串,在防范SQL注入的同時因為其預編譯的功能可以節約因多次重復輸入相同條件的SQL語句而消耗的資源。
總結:該系統經測試運行正常,可以實現登錄、注冊、添加留言、查看留言、刪除留言等功能。經過Web表單預提交的數據經過SQL預處理可以防止SQL注入。
參考文獻:
[1] 劉玉軒. 基于JSP 和MySQL 的留言板系統設計與實現[J].計算機與信息技術。
[2] 張興科. JSP動態網站設計項目教程. 北京: 中國人民大學出版社,2010
[3] 張志峰等。Java Web技術整合應用與項目實戰。北京:清華大學出版社,2010.
[4] 王燕,李明,王惠琴.??Web數據庫的連接技術及安全控制[J].