


摘 ?要:在實際教學中,MySQL數據庫被經常應用于中小型網站或者系統開發。以一個基于B/S架構的教務管理系統為例,對數據庫的訪問方式進行了研究。其中PHP連接數據庫無須使用連接池,連接速度較快;Java在連接和關閉數據庫時,JDBC連接較慢,若采用一些持久層框架,那么訪問數據庫效率增加。為減少SQL注入攻擊,可在數據庫設計時考慮存儲程序設計思想等。
關鍵詞:MySQL;PHP;Java;安全問題
中圖分類號:TP311.13;TP309 ? ? 文獻標識碼:A 文章編號:2096-4706(2020)21-0144-04
Discussion on MySQL Database Access and Security Issue Based on Teaching
ZHOU Xiaoli
(Sichuan Top IT Vocational Institute,Chengdu ?611743,China)
Abstract:In practical teaching,MySQL database is often used in small and medium-sized websites or system development. Taking an educational administration management system based on B/S architecture as an example,the method of database access is studied. Among them,PHP does not need to use the connection pool to connect to the database,so the connection speed is faster;when Java connects and closes the database,JDBC connection is slower,if some persistence layer framework is adopted,the efficiency of accessing the database will be increased. In order to reduce SQL injection attacks,we can consider the idea of storage program design in database design.
Keywords:MySQL;PHP;Java;security issue
0 ?引 ?言
四川托普信息技術職業學院立足區域經濟社會發展需求,主動對接四川省支柱產業,努力打造“信息技術”特色,其中軟件技術專業是省點專業,以培養軟件開發類、Web應用類、測試類人才為目標。在教授軟件開發類課程時,例如網站開發或者系統開發時,通常涉及前端、服務器、數據庫等幾個方面,其中數據庫是存儲、查閱數據的倉庫,經常使用MySQL數據庫來進行教學演示。MySQL作為關系型數據庫管理系統的代表,語法簡單、標準、體積小,是學院主要教授的數據庫技術,易于被學生接受。學生普遍反應學習相對容易上手,且能舉一反三。以下圍繞一個基于B/S架構的教務管理系統探討數據庫的訪問方式和安全問題。
開發一個教務管理系統,主要是為了將過去的前往政教處遞交各種報告的教學申請流程逐漸轉變成為網絡教務教學管理系統,實現從傳統教務管理方式到網絡教務管理方式的過渡。教務管理系統一般采用瀏覽器/服務器(Browser/Server,B/S)軟件架構方式,由服務端與瀏覽器端組成,同時由于采用B/S模式,可以實現使用瀏覽器進行訪問,減少了需要下載特定客戶端的麻煩,提高了系統的多平臺性,通常前端采用HTML、CSS、JavaScript及EasyUI、Bootstrap框架實現,可以滿足主流瀏覽器的兼容。服務端采用PHP語言開發或者Java語言開發,數據庫采用MySQL。其中教務管理系統的整體結構框架如圖1所示。
教務管理系統包含管理員、學生和教師三個模塊。其中管理員模塊有管理管理員、管理學生、管理教師、管理系、部等功能;學生模塊有查詢、個人信息、考試、成績等功能;教師模塊有查詢、登錄成績、查詢成績等功能。這些都需要大量的數據,都用數據庫進行存儲,以下介紹兩種訪問數據庫的方式。
1 ?使用PHP訪問MySQL數據庫
PHP作為一種跨平臺的動態網站服務端腳本語言,可在Windows、Linux等多種平臺上運行,支持MySQL數據庫訪問。基于B/S架構的教務管理系統,服務端以PHP作為開發語言,目前高版本通過MySQLi面向對象方式連接數據庫,以下給出主要的PHP訪問數據庫的代碼:
<?php
session_start();
$conn = new mysqli("localhost","root","root","easyui");//連接數據庫
$manager=$_POST["manager"];
$password=$_POST["password"];
$sql="select * from easyui_admin where manager= '$manager' and password='$password' LIMIT 1";//查詢語句
$result = $conn -> query($sql); //連接查詢sql語句
if(!!mysqli_fetch_array($result,MYSQLI_ASSOC)){//判斷連接狀態
$_SESSION['admin']=$manager;
echo 1;//連接成功
}else{
echo 0;//連接失敗
}
?>
上述給出了數據庫連接,定義變量,創建查詢語句,連接查詢語句,最后判斷連接狀態過程。PHP操作數據庫是實現數據庫的增加、刪除、修改、查詢,PHP中MySQLi創建查詢語句如下:
$sql = "CREATE TABLE STUDENT ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(10) NOT NULL, lastname VARCHAR(10) NOT NULL, email VARCHAR(20) )";
插入查詢語句、插入多余數據等如下:
$sql = "INSERT INTO STUDENT (firstname, lastname, email) VALUES ('Wang', 'Wu', 'WangWu@qq.com')";
$sql = "INSERT INTO STUDENT (firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com');";
$sql .= "INSERT INTO STUDENT (firstname, lastname, email) VALUES ('Zhang', 'San', 'ZhangSan@qq.com');";
$sql .= "INSERT INTO STUDENT (firstname, lastname, email) VALUES ('Li', 'Si', 'LiSi@qq.com')";
PHP通常也考慮預處理語句,它用于執行多個相同的SQL語句,并且執行效率更高。預處理語句通過預處理、數據庫解析、編譯,對SQL語句模板執行查詢優化,并存儲結果不輸出執行,最后,將應用綁定的值傳遞給參數,數據庫執行語句。預處理語句對于防止MySQL注入是非常有用的,因為參數值發送后使用不同的協議,保證了數據的合法性。
從上述PHP訪問數據庫可以看出,PHP操控數據庫的語句特點是:語法簡潔,不需要聲明太多的類型,直接調用。操縱數據庫過程其實就是使用了原始的SQL的語句,然后用PHP執行語句,并且返回對應的數據結構,無需連接池,直接連接前后端,完成教務管理系統設計與實現,因此PHP連接數據庫非常快,性能高。
2 ?Java訪問數據庫
Java是一門面向對象編程語言,整體語法簡潔,吸收了C語言的各種優點,摒棄了C語言里難以理解的多繼承、指針等概念,Java語言整體功能強大、簡單、易學易用。開發此教務管理系統,以Java語言作為后端開發語言,也能極好地實現面向對象理論,在教學中,可使學生理解編程過程,實現基本功能。采用Java連接MySQL,Java具有堅固、安全、易于使用、易于理解和從網絡上自動下載等特性,是編寫數據庫應用程序的一個不錯的選擇。以下介紹為Java連接數據庫的通用方法:
(1)用JDBC連接MySQL數據庫主要代碼為:
public static Connection getConnection(String user, String pass) {
Connection conn = null;//聲明連接對象
String driver = "com.mysql.jdbc.Driver";// 驅動程序類名
String url = "jdbc:mysql://localhost:3306/test?" // 數據庫URL
+ "useUnicode=true&characterEncoding=UTF8";// 防止亂碼
try {
Class.forName(driver);// 注冊(加載)驅動程序
conn = DriverManager.getConnection(url, user, pass);// 獲取數據庫連接
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
// 釋放數據庫連接
public static void releaseConnection(Connection conn) {
try {
if (conn != null)
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
JDBC連接數據庫整合項目,如圖2所示。
但是使用JDBC操作數據庫也存在不足:頻繁開啟數據庫鏈接、關閉數據庫鏈接、消耗大量資源、連接速度相較于PHP較慢。因為其經常需要建立和維護連接池,消耗一些內存,所以實際的開發應用中,對于普遍的JDBC適合只要求普通程序開發,不用長期維護代碼,但是不適合數據庫的遷移。
(2)運用MyBatis框架訪問數據庫。在實際開發應用中,開發者常常使用一些封裝好的框架(DAO層),可以極大地提高性能,降低資源消耗,例如MyBatis、Spring MVC、Spring Boot等框架訪問MySQL數據庫。MyBatis是一款優秀的持久層框架,它支持定制化SQL、存儲過程以及高級映射,使用MyBatis框架的好處就是,不用再寫麻煩的DAO包,操作數據庫的代碼大大簡化,新建項目,然后導入MyBatis框架包和連接數據庫的連接包,使用JDBC新建數據庫連接.properties文件,注意這個文件中只能有等號這個特殊字符,不能有引號或者逗號。在完成的教務管理系統中,采用MyBatis框架訪問數據庫,首先創建SSM數據庫和相應的people,然后新建一個XML文件,連接數據庫:
通過新建xml配置文件,然后創建對應數據庫的POJO,接著創建Mapper接口和對應的mapper.xml配置文件,最后在mapper.xml映射文件的配置,很多工作就在xml配置文件中完成。實現上述操作的代碼如下所示:
select *from people
目前,用Java開發企業Web項目或者系統,教學中經常會將Spring、SpringMVC、MyBatis合并使用,搭建數據庫框架。如果數據量很大,一個MySQL庫存儲數據訪問效率很低,往往會采用分庫存儲管理的方式,采用多線程來提升數據庫的訪問效率。
3 ?關于數據庫訪問安全問題的探討
在設計應用系統或者網站時,我們還需要考慮SQL注入,SQL注入是Web網站排名的一種常見的安全漏洞,在教學過程中,適當地講解SQL注入的相關原理和運用,對于Web網站開發和應用具有非常重要的意義。SQL注入即把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意指令的SQL命令,相當于通過SQL語句惡意地調用后臺數據庫。具體來說,它是利用現有應用程序,將惡意的SQL命令注入后臺數據庫引擎執行的能力,通過在Web表單中輸入惡意SQL語句得到一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。攻擊者通過在應用程序預先定義好類(應用程序一般是Web應用程序,它允許用戶輸入查詢條件),并將查詢條件嵌入SQL語句中,提交到數據庫中執行。通過構建畸形SQL語句,攻擊者能夠獲取額外的信息數據。通過用戶提供的參數來查詢表中的數據,我們進行一個網站登錄界面測試,如在輸入“1”時,發現報錯了,說明有語法錯誤,可以在輸入框id構造的查詢如下:
Select firstname,surname from users where id=1;
當我們在1之后加一個引號,那么查詢語句會變成這樣:
Select firstname,surname from users where id=1;
由此可以看出,這里的單引號不匹配,查詢語句有問題。可以通過滲透測試sqlmap進行測試,通過邊演示邊讓學生操作的方式,在Kali中打開終端,輸入命令“sqlmap -u ‘http://192.168.0.3/dvwa/vulnerabilities/sqli/?id= 1&Submit= Submit#' --Cookie=‘security=low;PHPSESSID=gaqenatrtudmob23522r97jrt7”,進行掃描,如圖3所示。
圖3可以獲得瀏覽器獲得Cookie信息,說明URL中的id參數存在著SQL注入點,還可以進一步探測數據庫的名稱、密碼、表和表的字段、實現對數據庫的破解,如圖4所示。
在教學過程中,發現學生如果MySQL基礎較好,就能夠很容易理解,部分學生MySQL基礎較差,理解起來較難,可嘗試運用對比的方法進行教學。學生復習了MySQL中數據庫、表的創建、數據庫的增加、插入、修改、查詢等基礎知識和Java Web的JavaScript、cookie等專業知識,以教務管理系統為例,演示登錄界面的制作、運用,在教學中結合前端JavaScript、Cookie網頁和Java EE后臺登錄界面設計相關知識,詳細演示了黑客進行SQL注入的相關過程,運用了一種滲透測試工具——sqlmap工具進行測試,通過邊演示邊讓學生操作的方式,理解SQL注入過程,對于Web開發具有非常重要的意義。通過類比方法進行教學,學生的思路更加清晰,進一步加深了學習的知識,提高了探索的興趣,對于后續相關的工作和學習奠定了基礎,將所學知識全面應用起來,提高學生的知識可遷移能力。通過實際案例演示讓學生明白了SQL注入過程,除了sqlmap等滲透測試工具測試漏洞,構造shell語句,還可以通過以下的方法在一定程度上降低SQL注入的危險。
在數據查詢存取時可以采用參數化的SQL或者直接使用存儲過程。SQL參數的傳遞過程中涉及單引號和連字符等,可以通過在數據庫設計時,嚴格按照存儲過程的規則,對于預防注入攻擊具有顯著的效果;由于Web系統前端網頁中,攻擊者容易獲得網頁的前端源代碼,通過修改驗證合法性的腳本(或者直接刪除腳本),然后將非法內容通過修改后的表單提交給服務器,制作釣魚網站,即通過制作模擬網站,獲得用戶的個人信息(含銀行卡賬號等信息),將會帶來巨大的安全隱患。可以通過采用正則表達式或者通過驗證的數據,結合數字簽名或者哈希函數等進行加密,通過對密碼等敏感信息進行加密,并進行過濾,當攻擊者或者黑客在進行攻擊時,對密碼進行暴力破解難度非常大,對于黑客攻擊有一定的防止作用。
4 ?結 ?論
在高職院校教學中,基于Web開發的應用越來越普遍,對海量的數據實現保存、新建、存儲、修改等,數據庫應運而生;講授Web類開發教學過程中,如一個教務管理系統,前端采用HTML、CSS、JavaScript及EasyUI或Bootstrap框架,服務器端以PHP或者Java兩種語法為主要編程語言,兩者的連接方式不同、連接速度不同、連接性能也存在差異,PHP因為其語法的簡潔,在不考慮IO性能的基礎上,無須使用連接池和維護連接池,連接數據庫相較于Java更快,Java主要慢在連接和關閉數據庫。JDBC在第一次連接數據庫時會動態加載驅動,非常耗時,因此使用Java要記住使用數據庫連接池,避免連接浪費大量時間。當然,這也造成了數據庫的負擔,勢必影響內存占用,但是創建隨機數的算法實現各不相同,所以不具備可比性。在Web應用程序后續開發類課程階段,嘗試通過類比方式,融合MySQL基礎、JavaScript、Cookie網頁和Java EE等專業知識,運用sqlmap等滲透測試工具,讓學生深刻理解了SQL注入的相關過程,加深了對知識的理解,在數據庫設計階段,如注重存儲程序設計思想等,對于Web網站或者系統等開發項目具有一定的積極意義。
參考文獻:
[1] 汪曉青.MySQL數據庫基礎實例教程 [M].北京:人民郵電出版社,2020.
[2] 黑馬程序員.PHP網站開發實例教程:第2版 [M].北京:人民郵電出版社,2020.
[3] 圣文順,李曉明,劉進芬.Java Web程序設計及項目實戰:微課視頻版 [J].北京:清華大學出版社,2020.
[4] 金濤,張啟翔.基于SQL注入的Web滲透技術取證方法的研究 [J].網絡空間安全,2017,8(Z3):55-58.
作者簡介:周小麗(1988.05—),女,漢族,四川成都人,助理研究員,教師,本科,學士學位,研究方向:計算機技術。