引言 随着互联网的发展,人们在享受互联网带来的便捷的服务的时候,也面临着个人的隐私泄漏的问题。小到一个拥有用户系统的小型论坛,大到各个大型的银行机构,互联网安全问题都显得格外重要。而这些网站的背后,则是支撑整个服务的核心数据库。可以说数据库就是这些服务的命脉,没有数据库,也就无从谈起这些服务了。 对于数据库系统的安全特性,主要包括数据独立性、数据安全性、数据完整性、并发控制、故障恢复等方面。而这些里面显得比较重要的一个方面是数据的安全性。由于开发人员的设计不周到,以及数据库的某些缺陷,很容易让黑客发现系统的漏洞,从而造成巨大的损失。 接下来本文将会介绍非常常见的一种攻击数据库的方法:SQL注入,以及使用在项目使用Java开发的情况下如何使用SpringMVC的拦截器实现防止SQL注入的功能。 SQL注入 SQL注入简介 通俗的讲,SQL注入就是恶意黑客或者竞争对手利用现有的B/S或者C/S架构的系统,将恶意的SQL语句通过表单等传递给后台SQL数据库引擎执行。比如,一个黑客可以利用网站的漏洞,使用SQL注入的方式取得一个公司网站后台的所有数据。试想一下,如果开发人员不对用户传递过来的输入进行过滤处理,那么遇到恶意用户的时候,并且系统被发现有漏洞的时候,后果将是令人难以想象的。最糟糕的是攻击者拿到了数据库服务器最高级的权限,可以对整个数据库服务器的数据做任何操作。 通常情况下,SQL注入攻击一般分为以下几个步骤: 判断WEB环境是否可以注入SQL。对于一个传统的WEB网页来说,如果是一个简单的静态页面,比如地址为http://www.news.com/100.html的网页,这是一个简单的静态页面,一般不涉及对数据库的查询。而如果这个网页的网址变成了:http://www.news.com/news.asp?id=100 那么,这就是一个根据主键id来查询数据的动态网页了。攻击者往往能够在 id=100的后面加上一些自己的SQL,用来“欺骗”过应用程序。 寻找SQL注入点。当攻击者确定某个页面可以使用SQL注入之后,他一般会寻找可以SQL注入的点。而这些点往往就是网页或者应用程序中的用于向服务器发送用户数据的表单了。一般的流程是,客户端通过这些表单发送一些用户信息的字段,比如用户名和密码,接着服务器就会根据这些字段去查询数据库。而如果用户输入了一些非法的字符,比如’这个符号,那么在SQL解析的时候,解析的结果可能并不是应用开发人员想象中那样。 寻找系统的后台。这一点就建立在破坏者对整个系统的了解程度上面了,如果攻击者对整个系统了如指掌,那么实现攻击也就是一件很简单的事情了。 入侵和破坏。当攻击者攻破系统之后,整个系统从某种意义上来讲已经失去意义了。 SQL注入案例 一个简单的PHP登录验证SQL注入 比如一个公司有一个用来管理客户的客户管理系统,在进入后台进行管理的时候需要输入用户名和密码。 假设在客户端传给服务器的字段分别为用户名username和密码password,那么如果用来处理登录的服务器端代码对用户的输入做以下处理: 上面的PHP代码就是首先获取客户端POST过来的填写在表单里面的用户名和密码,接着要MySQL去执行下面这条SQL语句: SELECT `id` FROM `users` WHERE `username` = username AND `password` = password; 可以看到上面的代码没有对用户的输入做任何的过滤,这是非常容易遭到黑客攻击的。 比如,一个用户在输入用户名的输入框里面输入了 user’;SHOW TABLES;-- 那么就会解析为下面的SQL: SELECT `id` FROM `users` WHERE `username` = ‘user’;SHOW TABLES;-- AND `password` = password; 可以看到被解析的SQL被拆分为了2条有用的SQL: (1)SELECT `id` FROM `users` WHERE `username` = ‘user’; (2)SHOW TABLES; 而后面验证密码的部分就被注释掉了。这样攻击者就轻松的获得了这个数据库里面的所有表的名字。同样的道理,如果攻击者在输入框里面输入: ’;DROP TABLE [table_name];-- 那么,这一张表就被删除了,可见后果是非常严重的。 而用户如果在用户名输入框里面输入了:user’or 1=1-- 那么会被解析成: SELECT `id` FROM `users` WHERE `username` = ‘user’ or 1=1-- AND `password` = password; 这里可以看到1=1永远为真,这样不用输入用户名就直接可以登入系统了。 一个ASP新闻动态页面的id查询 比如有一个新闻网站的动态页面是这种格式: http://www.news.com/news.asp?id=100 那么当用户在浏览器的地址框里面输入 http://www.news.com/news.asp?id=100;and user>0 那么如果这个网站的数据库用的是SQL Server的话,那么SQL Server在解析的时候,由于user是SQL Server的一个内置变量,它的值就是当前连接数据库的用户,那么SQL在执行到这里的时候会拿一个类型为nvarchar的和一个int类型的比较。比较过程中就必然涉及类型的转化,然而不幸的是,转化过程并不是一帆风顺,出错的时候SQL Server将会给出类似将nvarchar值”aaa”转为为int的列时发生语法错误。这个时候攻击者就轻松的获得了数据库的用户名。 SpringMVC拦截器防止SQL注入 为了有效的减少以及防止SQL注入的攻击,开发人员在开发的时候一定不要期待用户的输入都是合理的,当用户输入完毕之后,应该严谨的对用户提交的数据进行格式上的检查以及过滤,尽可能的减少被注入SQL 的风险。 一般来说,不同的服务器端语言都有不同的解决方案。比如拿中小型企业采用得最多的PHP语言来说,PHP的官方就为开发者提供了这样的一些函数,比如mysql_real_escape_string()等。 接下来会详细介绍如何通过SpringMVC的拦截器实现防止SQL注入的功能。 这里以我的大数据人才简历库的拦截器为例。 自定义拦截器类实现HandlerInterceptor接口 package com.data.job.util.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Enumeration; /** * 防止SQL注入的拦截器 * * @author tyee.noprom@qq.com * @time 2/13/16 8:22 PM. */ public class SqlInjectInterceptor implements HandlerInterceptor { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception { Enumeration names = request.getParameterNames(); while (names.hasMoreElements()) { String name = names.nextElement(); String[] values = request.getParameterValues(name); for (String value : values) { value = clearXss(value); } } return true; } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView modelAndView) throws Exception { } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) throws Exception { } /** * 处理字符转义 * * @param value * @return */ private String clearXss(String value) { if (value == null || "".equals(value)) { return value; } value = value.replaceAll("<", "<").replaceAll(">", ">"); value = value.replaceAll("\\(", "(").replace("\\)", ")"); value = value.replaceAll("'", "'"); value = value.replaceAll("eval\\((.*)\\)", ""); value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\""); value = value.replace("script", ""); return value; } } 配置拦截器 SQL注入总结 安全问题从古至今都有着非常高的关注度,如今互联网高速发达,各种网络应用层出不穷。不管是现在炙手可热的云计算和大数据,还是传统的B/S或者C/S架构的网络应用,数据的安全性是至关重要的。从应用层面来讲,网络应用的开发者可以通过完善软件的架构,尽量减少因为BUG而导致的数据泄漏的问题。开发者可以不断的审视与完善自己的系统,站在攻击者的角度上去开发某些关键的安全性要求比较高的环节,如银行支付部分等,这样能够在一定程度上面减少SQL注入等应用层面攻击数据库的风险。
作者: noprom 
链接:http://www.imooc.com/article/6137
来源:慕课网

SpringMVC利用拦截器防止SQL注入的更多相关文章

  1. Spring MVC通过拦截器处理sql注入、跨站XSS攻击风险

    sql注入就是通过url或者post提交数据时候,字符串类型的参数会被别人利用传入sql语句,最终破坏数据库或者达到一些见不得人的目的. 有时候因为业务需要url中会带一些参数,比如 ?type=xx ...

  2. 基于注解风格的Spring-MVC的拦截器

    基于注解风格的Spring-MVC的拦截器 Spring-MVC如何使用拦截器,官方文档只给出了非注解风格的例子.那么基于注解风格如何使用拦截器呢? 基于注解基本上有2个可使用的定义类,分别是Defa ...

  3. Mybatis利用拦截器做统一分页

    mybatis利用拦截器做统一分页 查询传递Page参数,或者传递继承Page的对象参数.拦截器查询记录之后,通过改造查询sql获取总记录数.赋值Page对象,返回. 示例项目:https://git ...

  4. 转 :关于springmvc使用拦截器

    原博客: http://elim.iteye.com/blog/1750680 SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的 ...

  5. springmvc的拦截器

    什么是拦截器                                                         java里的拦截器是动态拦截action调用的对象.它提供了一种机制可以使 ...

  6. SpringMVC经典系列-14自己定义SpringMVC的拦截器---【LinusZhu】

    注意:此文章是个人原创.希望有转载须要的朋友们标明文章出处.假设各位朋友们认为写的还好,就给个赞哈.你的鼓舞是我创作的最大动力,LinusZhu在此表示十分感谢,当然文章中如有纰漏,请联系linusz ...

  7. SpringMVC 学习-拦截器 HandlerInterceptor 类

    一.拦截器 HandlerInterceptor 类的作用 SpringMVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理. 二.怎么使用呢? 1. ...

  8. springMVC的拦截器工作流程

    首先,springmvc的拦截器配置在这就不多说了.主要讲一下拦截器的三个方法的执行顺序. preHandle方法一定是最先执行的方法,如果它返回为false下面的方法均不执行. postHandle ...

  9. SpringBoot拦截器中无法注入bean的解决方法

    SpringBoot拦截器中无法注入bean的解决方法 在使用springboot的拦截器时,有时候希望在拦截器中注入bean方便使用 但是如果直接注入会发现无法注入而报空指针异常 解决方法: 在注册 ...

随机推荐

  1. Java问题:Quartz,Hibernate,Spring,Tomcat中定时任务无故停止,没有错误

    最近在做一个java项目的时候遇到一个十分奇怪的问题,想到大家可能也会遇到这样的问题,所以在此发出来,希望大家遇到的时候能够快速解决! 直入主题 问题:使用quartz进行定时任务自动执行的时候,用到 ...

  2. 如何引用XML文件生成C#类

    目录 XSD File Generate Class File Simply. 1 Why use XSD file to create C# classes?... 2 How to convert ...

  3. 软工实践练习——使用Git进行代码管理

    GITHUB上的预备活动: 注册 创建小组Organization,邀请组员进来 将代码库fork到小组Organization底下 下载并使用GIT: Git的安装 使用Git进行代码管理 1.从百 ...

  4. cygwin 的不同文件类型显示不同的颜色

    正常情况下,我们的cygwin安装好之后,不管是文件还是文件夹显示的颜色都是一样的,这样在我们平时的工作中很不方便 所以这里记录一下怎么设置成彩色的,其实很简单. 直接修改文件 .bashrc vim ...

  5. 【kAri OJ】621. 廖神的树

    时间限制 3000 ms 内存限制 65536 KB 题目描述 廖神和男神在植树节的时候准备玩一个奇怪的游戏,他们现在有一个被分割成n*n个格子的矩形土地,他们现在准备往这个地里种树,但这个种树游戏必 ...

  6. 宿主机( win 7 系统) ping 虚拟机VMware( cent os 6.6 ) 出现“请求超时”或者“无法访问目标主机”的解决方法

    首先虚拟机的网络连接设置为"Host-only": 然后在 cmd 窗口中查看 VMnet1 的 ip 地址,这里是 192.168.254.1 接下来在 Linux 中设置网卡地 ...

  7. 一个项目中哪些文件是要上传到 git上的,哪些是不必要的

  8. [NOIP2008] 提高组 洛谷P1006 传纸条

    题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...

  9. 安卓系统源码编译系列(六)——单独编译内置浏览器WebView教程

    原文                   http://blog.csdn.net/zhaoxy_thu/article/details/18883015                 本文主要对从 ...

  10. linux性能监测与优化

    top命令命令功能top命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息的监测系统性能和运行信息的实用工具.命令语法top(选项)选项说明-b:以批处理模式操作;-d:屏幕刷新间隔时间. ...