APP下载

基于教学中的MySQL数据库访问和安全问题探讨

2020-07-09周小丽

现代信息科技 2020年21期
关键词:安全问题

摘  要:在实际教学中,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配置文件中完成。实现上述操作的代码如下所示:

目前,用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—),女,汉族,四川成都人,助理研究员,教师,本科,学士学位,研究方向:计算机技术。

猜你喜欢

安全问题
高校计算机安全防范措施研究
输变电设备运行及安全防范措施
浅谈煤矿瓦斯的安全管理