标题 | SQL注入攻击及在Java Web应用中的防御方法研究 |
范文 | 梁天一 【摘要】 互联网的高速发展使得网络安全成为各界关注的焦点问题。人们把在电子商务、社交网络等互联网应用中产生的大量重要数据存储于数据库中,而这些数据库便成为网络黑客的攻击目标。目前,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. |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。