APP下载

SQL注入攻击及在Java Web应用中的防御方法研究

2016-03-16梁天一

中国新通信 2016年3期
关键词:防御数据库网络安全

梁天一

【摘要】 互联网的高速发展使得网络安全成为各界关注的焦点问题。人们把在电子商务、社交网络等互联网应用中产生的大量重要数据存储于数据库中,而这些数据库便成为网络黑客的攻击目标。目前,SQL注入攻击是网络中最为猖獗的黑客攻击行为之一。本文将详细阐述SQL注入式攻击的原理,并给出在Java Web应用程序中防御SQL注入攻击的有效方法。

【关键词】 SQL注入 网络安全 数据库 Java Web 防御

如今,互联网已经融入现代社会的方方面面,电子商务、社交网络、在线教育(MOOC)已经成为当下人们生活不可或缺的组成。人们在使用这些互联网应用时,会产生大量与自身相关的数据存储在数据库中。由于这些数据的潜在价值(如个人隐私数据、网银账户等),使得它们成为网络黑客主要的攻击目标之一。目前,最为常见的、破坏性最强的针对互联网应用数据库系统的攻击方式是SQL注入攻击。综合统计资料来看,SQL注入约占据互联网安全威胁性事件总数的1/3,且程逐年递增趋势;DB Networks的统计表明,2014年SQL注入漏洞数量较2013年增长104%[1]。因此,本文将探讨、研究注入技术背后的原理、实施方法和分类,来更好的应对这类攻击;同时结合Java Web开发技术,给出在Java Web应用程序中防御SQL注入攻击的有效方法。

一、SQL注入攻击的原理

SQL注入攻击(SQL Injection Attack, SQLI),是指利用应用程序层与数据库层之间的安全漏洞、通过恶意SQL语句攻击这些漏洞来非法获取目标数据的行为。简单来说,精心设计的恶意SQL语句会从应用程序前端提交至后台数据库执行,执行过程中应用程序开发者编写的原始SQL语句会被恶意语句篡改,从而暴露攻击者想要获取的隐私数据。

图1描述了一个B/S架构应用程序遭受SQL注入攻击的基本流程。假设该系统关系型数据库中存储有某单位全体员工的个人信息,提交URL:

demo.com/liststaff?staff_id=13098

Web应用服务器将获取到参数staff_id=130

98,并在数据库中执行下列SQL查询语句:

SELECT name, gender, age, salary, address

FROM t_staff

WHERE staff_id = ‘13098;

数据库将返回员工ID(staff_id)为13098的员工的详细个人详细,如姓名、收入、家庭住址等。如果攻击者想要窃取全部员工的个人信息,针对上述SQL查询语句,他可以构造这样一条请求URL:

demo.com/liststaff?staff_id=13098 or ‘1=1

那么在数据库中将执行下列查询语句:

SELECT name, gender, age, salary, address

FROM t_staff

WHERE staff_id = ‘13098 or ‘1 = 1;

由于staff_id=‘13098 or ‘1 = 1为永真句,因此该系列语句等效为:

SELECT name, gender, age, salary, address

至此,攻击者成功窃取了全部员工的个人信息。

二、Java Web程序对SQL注入攻击的防御方法

尽管Java Web技术在设计之初就十分重视安全性,Java Web技术也是目前最安全的开发技术之一,但在实际开发和应用中,使用Java Web技术构建的应用仍有可能受到SQL注入攻击的破坏。本文将讨论几种在Java Web应用中防御SQL注入攻击的有效方法。

2.1 使用正则表达式过滤参数

从前文论述我们可以看出,SQL注入攻击的核心在于向数据库服务器提交含有特殊含义的字符,改变原始SQL语句的语义。因此,使用正则表达式过滤掉用户提交参数中的特殊字符(如转义字符),便能大大降低发生注入攻击的概率。

上述代码中的正则表达式”.*([‘;]+|(--)+).*”可以检测出用户提交参数中的特殊字符(如转义字符单引号),将其替换为空格符,防止数据库受到注入攻击。

public static String filterSQLInjection(String param) {

return param.replaceAll(".*([;]+|(--)+).*", "");

}

String userName = filterSQLInjection(request. getParameter(userName));

String userPasswd = filterSQLInjection(request. getParameter(userPasswd));

2.2 使用预编译技术防止SQL注入

SQL注入攻击能够实现的基本前提是程序员使用拼接SQL语句的方式编写数据库操作语句,如:

String sql = “SELECT * FROM t_admin WHERE user_ name = ” + userName + “ AND password = ” + userPasswd;

ResultSet rs = statement.executeQuery(sql);

因此,防御SQL注入攻击的最有效方法是禁止使用拼接的方法编写SQL语句,转而使用预编译技术进行数据库操纵方面的开发。

所谓预编译,指的是将格式结构固定的SQL语句编译后,存储在数据库缓存中,当调用该语句时,直接执行缓存中编译后的结果。使用预编译机制可以消除注入攻击的隐患,因为SQL语句已经通过编译,传入的参数不会跟其发生任何匹配关系。在Java中,通过PreparedStatement类实现了预编译相关功能,使用方法如下:

String sql= "SELECT * FROM t_admin WHERE user_ name=? AND password=?";

PreparedStatement psmt=conn.prepareSattement(sql);

psmt.setString(1, userName);

psmt.setString(2, userPasswd);

ResultSet rs = preState.executeQuery();

三、结束语

本文结合实例,论述了SQL注入攻击的原理和实施过程,讨论了SQL注入攻击的分类和最新发展;最后,提出了Java Web应用程序防御SQL注入的几种有效方法,具有一定借鉴意义。

参 考 文 献

[1] 王丽丽, 彭一楠, 王轶骏. 浅析SQL盲注攻击的实现[J]. 信息安全与通信保密, 2008, 05期(05):71-73.

猜你喜欢

防御数据库网络安全
全国多地联动2020年国家网络安全宣传周启动
新量子通信线路保障网络安全
保护个人信息安全,还看新法
数据库
数据挖掘在计算机网络病毒防御中的应用
论校园无线局域网的攻击与防御
数据库
刍议新局势下计算机病毒防御技术
数据库
中国网络安全产业联盟正式成立