


摘 ?要:在實(shí)際教學(xué)中,MySQL數(shù)據(jù)庫被經(jīng)常應(yīng)用于中小型網(wǎng)站或者系統(tǒng)開發(fā)。以一個(gè)基于B/S架構(gòu)的教務(wù)管理系統(tǒng)為例,對數(shù)據(jù)庫的訪問方式進(jìn)行了研究。其中PHP連接數(shù)據(jù)庫無須使用連接池,連接速度較快;Java在連接和關(guān)閉數(shù)據(jù)庫時(shí),JDBC連接較慢,若采用一些持久層框架,那么訪問數(shù)據(jù)庫效率增加。為減少SQL注入攻擊,可在數(shù)據(jù)庫設(shè)計(jì)時(shí)考慮存儲(chǔ)程序設(shè)計(jì)思想等。
關(guān)鍵詞:MySQL;PHP;Java;安全問題
中圖分類號:TP311.13;TP309 ? ? 文獻(xiàn)標(biāo)識碼: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 ?引 ?言
四川托普信息技術(shù)職業(yè)學(xué)院立足區(qū)域經(jīng)濟(jì)社會(huì)發(fā)展需求,主動(dòng)對接四川省支柱產(chǎn)業(yè),努力打造“信息技術(shù)”特色,其中軟件技術(shù)專業(yè)是省點(diǎn)專業(yè),以培養(yǎng)軟件開發(fā)類、Web應(yīng)用類、測試類人才為目標(biāo)。在教授軟件開發(fā)類課程時(shí),例如網(wǎng)站開發(fā)或者系統(tǒng)開發(fā)時(shí),通常涉及前端、服務(wù)器、數(shù)據(jù)庫等幾個(gè)方面,其中數(shù)據(jù)庫是存儲(chǔ)、查閱數(shù)據(jù)的倉庫,經(jīng)常使用MySQL數(shù)據(jù)庫來進(jìn)行教學(xué)演示。MySQL作為關(guān)系型數(shù)據(jù)庫管理系統(tǒng)的代表,語法簡單、標(biāo)準(zhǔn)、體積小,是學(xué)院主要教授的數(shù)據(jù)庫技術(shù),易于被學(xué)生接受。學(xué)生普遍反應(yīng)學(xué)習(xí)相對容易上手,且能舉一反三。以下圍繞一個(gè)基于B/S架構(gòu)的教務(wù)管理系統(tǒng)探討數(shù)據(jù)庫的訪問方式和安全問題。
開發(fā)一個(gè)教務(wù)管理系統(tǒng),主要是為了將過去的前往政教處遞交各種報(bào)告的教學(xué)申請流程逐漸轉(zhuǎn)變成為網(wǎng)絡(luò)教務(wù)教學(xué)管理系統(tǒng),實(shí)現(xiàn)從傳統(tǒng)教務(wù)管理方式到網(wǎng)絡(luò)教務(wù)管理方式的過渡。教務(wù)管理系統(tǒng)一般采用瀏覽器/服務(wù)器(Browser/Server,B/S)軟件架構(gòu)方式,由服務(wù)端與瀏覽器端組成,同時(shí)由于采用B/S模式,可以實(shí)現(xiàn)使用瀏覽器進(jìn)行訪問,減少了需要下載特定客戶端的麻煩,提高了系統(tǒng)的多平臺(tái)性,通常前端采用HTML、CSS、JavaScript及EasyUI、Bootstrap框架實(shí)現(xiàn),可以滿足主流瀏覽器的兼容。服務(wù)端采用PHP語言開發(fā)或者Java語言開發(fā),數(shù)據(jù)庫采用MySQL。其中教務(wù)管理系統(tǒng)的整體結(jié)構(gòu)框架如圖1所示。
教務(wù)管理系統(tǒng)包含管理員、學(xué)生和教師三個(gè)模塊。其中管理員模塊有管理管理員、管理學(xué)生、管理教師、管理系、部等功能;學(xué)生模塊有查詢、個(gè)人信息、考試、成績等功能;教師模塊有查詢、登錄成績、查詢成績等功能。這些都需要大量的數(shù)據(jù),都用數(shù)據(jù)庫進(jìn)行存儲(chǔ),以下介紹兩種訪問數(shù)據(jù)庫的方式。
1 ?使用PHP訪問MySQL數(shù)據(jù)庫
PHP作為一種跨平臺(tái)的動(dòng)態(tài)網(wǎng)站服務(wù)端腳本語言,可在Windows、Linux等多種平臺(tái)上運(yùn)行,支持MySQL數(shù)據(jù)庫訪問。基于B/S架構(gòu)的教務(wù)管理系統(tǒng),服務(wù)端以PHP作為開發(fā)語言,目前高版本通過MySQLi面向?qū)ο蠓绞竭B接數(shù)據(jù)庫,以下給出主要的PHP訪問數(shù)據(jù)庫的代碼:
<?php
session_start();
$conn = new mysqli("localhost","root","root","easyui");//連接數(shù)據(jù)庫
$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)){//判斷連接狀態(tài)
$_SESSION['admin']=$manager;
echo 1;//連接成功
}else{
echo 0;//連接失敗
}
?>
上述給出了數(shù)據(jù)庫連接,定義變量,創(chuàng)建查詢語句,連接查詢語句,最后判斷連接狀態(tài)過程。PHP操作數(shù)據(jù)庫是實(shí)現(xiàn)數(shù)據(jù)庫的增加、刪除、修改、查詢,PHP中MySQLi創(chuàng)建查詢語句如下:
$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) )";
插入查詢語句、插入多余數(shù)據(jù)等如下:
$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通常也考慮預(yù)處理語句,它用于執(zhí)行多個(gè)相同的SQL語句,并且執(zhí)行效率更高。預(yù)處理語句通過預(yù)處理、數(shù)據(jù)庫解析、編譯,對SQL語句模板執(zhí)行查詢優(yōu)化,并存儲(chǔ)結(jié)果不輸出執(zhí)行,最后,將應(yīng)用綁定的值傳遞給參數(shù),數(shù)據(jù)庫執(zhí)行語句。預(yù)處理語句對于防止MySQL注入是非常有用的,因?yàn)閰?shù)值發(fā)送后使用不同的協(xié)議,保證了數(shù)據(jù)的合法性。
從上述PHP訪問數(shù)據(jù)庫可以看出,PHP操控?cái)?shù)據(jù)庫的語句特點(diǎn)是:語法簡潔,不需要聲明太多的類型,直接調(diào)用。操縱數(shù)據(jù)庫過程其實(shí)就是使用了原始的SQL的語句,然后用PHP執(zhí)行語句,并且返回對應(yīng)的數(shù)據(jù)結(jié)構(gòu),無需連接池,直接連接前后端,完成教務(wù)管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn),因此PHP連接數(shù)據(jù)庫非常快,性能高。
2 ?Java訪問數(shù)據(jù)庫
Java是一門面向?qū)ο缶幊陶Z言,整體語法簡潔,吸收了C語言的各種優(yōu)點(diǎn),摒棄了C語言里難以理解的多繼承、指針等概念,Java語言整體功能強(qiáng)大、簡單、易學(xué)易用。開發(fā)此教務(wù)管理系統(tǒng),以Java語言作為后端開發(fā)語言,也能極好地實(shí)現(xiàn)面向?qū)ο罄碚摚诮虒W(xué)中,可使學(xué)生理解編程過程,實(shí)現(xiàn)基本功能。采用Java連接MySQL,Java具有堅(jiān)固、安全、易于使用、易于理解和從網(wǎng)絡(luò)上自動(dòng)下載等特性,是編寫數(shù)據(jù)庫應(yīng)用程序的一個(gè)不錯(cuò)的選擇。以下介紹為Java連接數(shù)據(jù)庫的通用方法:
(1)用JDBC連接MySQL數(shù)據(jù)庫主要代碼為:
public static Connection getConnection(String user, String pass) {
Connection conn = null;//聲明連接對象
String driver = "com.mysql.jdbc.Driver";// 驅(qū)動(dòng)程序類名
String url = "jdbc:mysql://localhost:3306/test?" // 數(shù)據(jù)庫URL
+ "useUnicode=true&characterEncoding=UTF8";// 防止亂碼
try {
Class.forName(driver);// 注冊(加載)驅(qū)動(dòng)程序
conn = DriverManager.getConnection(url, user, pass);// 獲取數(shù)據(jù)庫連接
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
// 釋放數(shù)據(jù)庫連接
public static void releaseConnection(Connection conn) {
try {
if (conn != null)
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
JDBC連接數(shù)據(jù)庫整合項(xiàng)目,如圖2所示。
但是使用JDBC操作數(shù)據(jù)庫也存在不足:頻繁開啟數(shù)據(jù)庫鏈接、關(guān)閉數(shù)據(jù)庫鏈接、消耗大量資源、連接速度相較于PHP較慢。因?yàn)槠浣?jīng)常需要建立和維護(hù)連接池,消耗一些內(nèi)存,所以實(shí)際的開發(fā)應(yīng)用中,對于普遍的JDBC適合只要求普通程序開發(fā),不用長期維護(hù)代碼,但是不適合數(shù)據(jù)庫的遷移。
(2)運(yùn)用MyBatis框架訪問數(shù)據(jù)庫。在實(shí)際開發(fā)應(yīng)用中,開發(fā)者常常使用一些封裝好的框架(DAO層),可以極大地提高性能,降低資源消耗,例如MyBatis、Spring MVC、Spring Boot等框架訪問MySQL數(shù)據(jù)庫。MyBatis是一款優(yōu)秀的持久層框架,它支持定制化SQL、存儲(chǔ)過程以及高級映射,使用MyBatis框架的好處就是,不用再寫麻煩的DAO包,操作數(shù)據(jù)庫的代碼大大簡化,新建項(xiàng)目,然后導(dǎo)入MyBatis框架包和連接數(shù)據(jù)庫的連接包,使用JDBC新建數(shù)據(jù)庫連接.properties文件,注意這個(gè)文件中只能有等號這個(gè)特殊字符,不能有引號或者逗號。在完成的教務(wù)管理系統(tǒng)中,采用MyBatis框架訪問數(shù)據(jù)庫,首先創(chuàng)建SSM數(shù)據(jù)庫和相應(yīng)的people,然后新建一個(gè)XML文件,連接數(shù)據(jù)庫:
通過新建xml配置文件,然后創(chuàng)建對應(yīng)數(shù)據(jù)庫的POJO,接著創(chuàng)建Mapper接口和對應(yīng)的mapper.xml配置文件,最后在mapper.xml映射文件的配置,很多工作就在xml配置文件中完成。實(shí)現(xiàn)上述操作的代碼如下所示:
select *from people
目前,用Java開發(fā)企業(yè)Web項(xiàng)目或者系統(tǒng),教學(xué)中經(jīng)常會(huì)將Spring、SpringMVC、MyBatis合并使用,搭建數(shù)據(jù)庫框架。如果數(shù)據(jù)量很大,一個(gè)MySQL庫存儲(chǔ)數(shù)據(jù)訪問效率很低,往往會(huì)采用分庫存儲(chǔ)管理的方式,采用多線程來提升數(shù)據(jù)庫的訪問效率。
3 ?關(guān)于數(shù)據(jù)庫訪問安全問題的探討
在設(shè)計(jì)應(yīng)用系統(tǒng)或者網(wǎng)站時(shí),我們還需要考慮SQL注入,SQL注入是Web網(wǎng)站排名的一種常見的安全漏洞,在教學(xué)過程中,適當(dāng)?shù)刂v解SQL注入的相關(guān)原理和運(yùn)用,對于Web網(wǎng)站開發(fā)和應(yīng)用具有非常重要的意義。SQL注入即把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意指令的SQL命令,相當(dāng)于通過SQL語句惡意地調(diào)用后臺(tái)數(shù)據(jù)庫。具體來說,它是利用現(xiàn)有應(yīng)用程序,將惡意的SQL命令注入后臺(tái)數(shù)據(jù)庫引擎執(zhí)行的能力,通過在Web表單中輸入惡意SQL語句得到一個(gè)存在安全漏洞的網(wǎng)站上的數(shù)據(jù)庫,而不是按照設(shè)計(jì)者意圖去執(zhí)行SQL語句。攻擊者通過在應(yīng)用程序預(yù)先定義好類(應(yīng)用程序一般是Web應(yīng)用程序,它允許用戶輸入查詢條件),并將查詢條件嵌入SQL語句中,提交到數(shù)據(jù)庫中執(zhí)行。通過構(gòu)建畸形SQL語句,攻擊者能夠獲取額外的信息數(shù)據(jù)。通過用戶提供的參數(shù)來查詢表中的數(shù)據(jù),我們進(jìn)行一個(gè)網(wǎng)站登錄界面測試,如在輸入“1”時(shí),發(fā)現(xiàn)報(bào)錯(cuò)了,說明有語法錯(cuò)誤,可以在輸入框id構(gòu)造的查詢?nèi)缦拢?/p>
Select firstname,surname from users where id=1;
當(dāng)我們在1之后加一個(gè)引號,那么查詢語句會(huì)變成這樣:
Select firstname,surname from users where id=1;
由此可以看出,這里的單引號不匹配,查詢語句有問題。可以通過滲透測試sqlmap進(jìn)行測試,通過邊演示邊讓學(xué)生操作的方式,在Kali中打開終端,輸入命令“sqlmap -u ‘http://192.168.0.3/dvwa/vulnerabilities/sqli/?id= 1&Submit= Submit#' --Cookie=‘security=low;PHPSESSID=gaqenatrtudmob23522r97jrt7”,進(jìn)行掃描,如圖3所示。
圖3可以獲得瀏覽器獲得Cookie信息,說明URL中的id參數(shù)存在著SQL注入點(diǎn),還可以進(jìn)一步探測數(shù)據(jù)庫的名稱、密碼、表和表的字段、實(shí)現(xiàn)對數(shù)據(jù)庫的破解,如圖4所示。
在教學(xué)過程中,發(fā)現(xiàn)學(xué)生如果MySQL基礎(chǔ)較好,就能夠很容易理解,部分學(xué)生MySQL基礎(chǔ)較差,理解起來較難,可嘗試運(yùn)用對比的方法進(jìn)行教學(xué)。學(xué)生復(fù)習(xí)了MySQL中數(shù)據(jù)庫、表的創(chuàng)建、數(shù)據(jù)庫的增加、插入、修改、查詢等基礎(chǔ)知識和Java Web的JavaScript、cookie等專業(yè)知識,以教務(wù)管理系統(tǒng)為例,演示登錄界面的制作、運(yùn)用,在教學(xué)中結(jié)合前端JavaScript、Cookie網(wǎng)頁和Java EE后臺(tái)登錄界面設(shè)計(jì)相關(guān)知識,詳細(xì)演示了黑客進(jìn)行SQL注入的相關(guān)過程,運(yùn)用了一種滲透測試工具——sqlmap工具進(jìn)行測試,通過邊演示邊讓學(xué)生操作的方式,理解SQL注入過程,對于Web開發(fā)具有非常重要的意義。通過類比方法進(jìn)行教學(xué),學(xué)生的思路更加清晰,進(jìn)一步加深了學(xué)習(xí)的知識,提高了探索的興趣,對于后續(xù)相關(guān)的工作和學(xué)習(xí)奠定了基礎(chǔ),將所學(xué)知識全面應(yīng)用起來,提高學(xué)生的知識可遷移能力。通過實(shí)際案例演示讓學(xué)生明白了SQL注入過程,除了sqlmap等滲透測試工具測試漏洞,構(gòu)造shell語句,還可以通過以下的方法在一定程度上降低SQL注入的危險(xiǎn)。
在數(shù)據(jù)查詢存取時(shí)可以采用參數(shù)化的SQL或者直接使用存儲(chǔ)過程。SQL參數(shù)的傳遞過程中涉及單引號和連字符等,可以通過在數(shù)據(jù)庫設(shè)計(jì)時(shí),嚴(yán)格按照存儲(chǔ)過程的規(guī)則,對于預(yù)防注入攻擊具有顯著的效果;由于Web系統(tǒng)前端網(wǎng)頁中,攻擊者容易獲得網(wǎng)頁的前端源代碼,通過修改驗(yàn)證合法性的腳本(或者直接刪除腳本),然后將非法內(nèi)容通過修改后的表單提交給服務(wù)器,制作釣魚網(wǎng)站,即通過制作模擬網(wǎng)站,獲得用戶的個(gè)人信息(含銀行卡賬號等信息),將會(huì)帶來巨大的安全隱患。可以通過采用正則表達(dá)式或者通過驗(yàn)證的數(shù)據(jù),結(jié)合數(shù)字簽名或者哈希函數(shù)等進(jìn)行加密,通過對密碼等敏感信息進(jìn)行加密,并進(jìn)行過濾,當(dāng)攻擊者或者黑客在進(jìn)行攻擊時(shí),對密碼進(jìn)行暴力破解難度非常大,對于黑客攻擊有一定的防止作用。
4 ?結(jié) ?論
在高職院校教學(xué)中,基于Web開發(fā)的應(yīng)用越來越普遍,對海量的數(shù)據(jù)實(shí)現(xiàn)保存、新建、存儲(chǔ)、修改等,數(shù)據(jù)庫應(yīng)運(yùn)而生;講授Web類開發(fā)教學(xué)過程中,如一個(gè)教務(wù)管理系統(tǒng),前端采用HTML、CSS、JavaScript及EasyUI或Bootstrap框架,服務(wù)器端以PHP或者Java兩種語法為主要編程語言,兩者的連接方式不同、連接速度不同、連接性能也存在差異,PHP因?yàn)槠湔Z法的簡潔,在不考慮IO性能的基礎(chǔ)上,無須使用連接池和維護(hù)連接池,連接數(shù)據(jù)庫相較于Java更快,Java主要慢在連接和關(guān)閉數(shù)據(jù)庫。JDBC在第一次連接數(shù)據(jù)庫時(shí)會(huì)動(dòng)態(tài)加載驅(qū)動(dòng),非常耗時(shí),因此使用Java要記住使用數(shù)據(jù)庫連接池,避免連接浪費(fèi)大量時(shí)間。當(dāng)然,這也造成了數(shù)據(jù)庫的負(fù)擔(dān),勢必影響內(nèi)存占用,但是創(chuàng)建隨機(jī)數(shù)的算法實(shí)現(xiàn)各不相同,所以不具備可比性。在Web應(yīng)用程序后續(xù)開發(fā)類課程階段,嘗試通過類比方式,融合MySQL基礎(chǔ)、JavaScript、Cookie網(wǎng)頁和Java EE等專業(yè)知識,運(yùn)用sqlmap等滲透測試工具,讓學(xué)生深刻理解了SQL注入的相關(guān)過程,加深了對知識的理解,在數(shù)據(jù)庫設(shè)計(jì)階段,如注重存儲(chǔ)程序設(shè)計(jì)思想等,對于Web網(wǎng)站或者系統(tǒng)等開發(fā)項(xiàng)目具有一定的積極意義。
參考文獻(xiàn):
[1] 汪曉青.MySQL數(shù)據(jù)庫基礎(chǔ)實(shí)例教程 [M].北京:人民郵電出版社,2020.
[2] 黑馬程序員.PHP網(wǎng)站開發(fā)實(shí)例教程:第2版 [M].北京:人民郵電出版社,2020.
[3] 圣文順,李曉明,劉進(jìn)芬.Java Web程序設(shè)計(jì)及項(xiàng)目實(shí)戰(zhàn):微課視頻版 [J].北京:清華大學(xué)出版社,2020.
[4] 金濤,張啟翔.基于SQL注入的Web滲透技術(shù)取證方法的研究 [J].網(wǎng)絡(luò)空間安全,2017,8(Z3):55-58.
作者簡介:周小麗(1988.05—),女,漢族,四川成都人,助理研究員,教師,本科,學(xué)士學(xué)位,研究方向:計(jì)算機(jī)技術(shù)。