关于SQL注入的问题以及解决方法
1.关于SQL注入
什么是SQL注入:
首先看一下以下代码:
- String sql = "select* from users where username='" + userName
 - + "' and password='" + passWord+"'";
 - Connection conn = null;
 - Statement state = null;
 - ResultSet result;
 - conn = JdbcUtil.getConnection();
 - System.out.println(sql);
 - try {
 - state = conn.createStatement();
 - result = state.executeQuery(sql);
 
这是一段根据传入用户名,密码查找用户表的代码。
在做用户登录的验证的时候,我们可能会根据用户所填写的用户名和密码在后台拼成一条SQL语句执行,去查用户表:
select* from users where username='张三' and password='小张',如果能查出结果则表示验证成功,允许登录,否则账号或密码错误不允许登录。那么在组成这条语句的过程中会存在一个叫做SQL注入的问题,就是用户在输入用户名或密码的时候填写某些内容使得后台所拼成的SQL语句语义有所变化。
举个例子,在没有防止SQL的情况下:假如我们知道一个用户叫做张三,但是不知道这个用户的密码是什么,我们依然可以在登录的时候在用户输入框写上:张三'# 然后密码框任意填:njksad。一点击登录,会发现居然能够登录上去。那是为什么呢?
这是因为#在SQL中的意思是注释,那么我们根据上面的情况来分析一下最终所拼成的SQL语句是怎样的,
select* from users where username='张三'#' and password='njksad'
为了让大家能够看清楚上面那条SQL语句,笔者特地加大显示,可以看到 username='张三' 之后是一个#
那就意味着之后的内容都是注释,也就是可以忽略掉那么这条语句真正发挥作用的部分就是:select* from users where username='张三'
直接变成了一条查找张三 的语句,完全不用经过密码验证。
2.防止SQL注入攻击
那么怎么才能做到防止SQL注入攻击呢?
在上面那段代码中,Statement的对象是用来执行SQL语句的,Statement有一个子类叫做PreparedStatement,可以做到防止SQL注入攻击,接下来我们来看看PreparedStatement有什么特点以及怎么使用:
PreparedStatement是Statement的孩子,不同的是,PreparedStatement使用预编译机制,在创建PreparedStatement对象时就需要将sql语句传入,传入的过程中参数要用?替代,这个过程回导致传入的sql被进行预编译,然后再调用PreparedStatement的setXXX将参数设置上去,由于sql语句已经经过了预编译,再传入特殊值也不会起作用了。
而且PreparedStatement使用了预编译机制,sql语句在执行的过程中效率比Statement要高。
- String sql = "select* from users where username=? and password=?";
 - Connection conn = null;
 - PreparedStatement state = null;
 - ResultSet result;
 - conn = JdbcUtil.getConnection();
 - System.out.println(sql);
 - try {
 - state = conn.prepareStatement(sql);
 - state.setString(1, userName);
 - state.setString(2, passWord);
 - result = state.executeQuery();
 
关于SQL注入的问题以及解决方法的更多相关文章
- 需要我们了解的SQL Server阻塞原因与解决方法
		
需要我们了解的SQL Server阻塞原因与解决方法 上篇说SQL Server应用模式之OLTP系统性能分析.五种角度分析sql性能问题.本章依然是SQL性能 五种角度其一“阻塞与死锁” 这里通过连 ...
 - SQL注入9种绕过WAF方法
		
SQL注入9种绕过WAF方法 0x01前言 WAF区别于常规 防火墙 是因为WAF能够过滤特定Web应用程序的内容,而常规防火墙则充当服务器之间的防御门.通过检查HTTP的流量,它可以防御Web应用安 ...
 - MySQL数据库”mysql SQL Error:1146,SQLState:42S02 “解决方法
		
项目在开发的时候在Mac平台下开发的,开发完了之后在LINUX环境上部署好之后,运行时MySQL数据库报错,提示为某个表不存在之类的错误信息,后来修改了MySQL的配置文件将大小写敏感去掉,问题解决. ...
 - 在Springmvc普通类@Autowired注入request为null解决方法
		
在Springmvc普通类@Autowired注入request为null解决方法 在类中加入以下注入request对象的代码,运行时发现request为null,注入失败.在@Controlle ...
 - PDO(PHP Data Object),Mysqli,以及对sql注入等问题的解决
		
这篇是上一篇 http://www.cnblogs.com/charlesblc/p/5987951.html 的续集. 看有的文章提到mysqli和PDO都支持多重查询,所以下面的url会造成表数据 ...
 - Java学习笔记47(JDBC、SQL注入攻击原理以及解决)
		
JDBC:java的数据库连接 JDBC本质是一套API,由开发公司定义的类和接口 这里使用mysql驱动,是一套类库,实现了接口 驱动程序类库,实现接口重写方法,由驱动程序操作数据库 JDBC操作步 ...
 - 【SpringBoot】拦截器使用@Autowired注入接口为null解决方法
		
最近使用SpringBoot的自定义拦截器,在拦截器中注入了一个DAO,准备下面作相应操作,拦截器代码: public class TokenInterceptor implements Handle ...
 - BCP  SQL导出EXCEL常见问题及解决方法;数据导出存储过程
		
一.‘xp_cmdshell’的启用 SQL Server阻止了对组件‘xp_cmdshell’的过程‘sys.xp_cmdshell’的访问.因为此组件已作为此服务嚣安全配置的一部分而被关 闭.系统 ...
 - mybatis项目报错:java.sql.SQLException: ORA-00911: 无效字符 解决方法
		
如果你用java写程序访问数据库,出现这个问题:java.sql.SQLException: ORA-00911: 无效字符 at oracle.jdbc.driver.DatabaseError.t ...
 
随机推荐
- 搜索专题:问题 E: 挑战ACM迷宫
			
这是往年校赛的一道题,最开始做这道题的时候还没有系统的学习过搜索,用了C语言学的回溯法尝试,毫无疑问的TLE: 学习了DFS之后,自己的剪枝功力不够,又是TLE,最后学了BFS之后,哇,终于做出来了, ...
 - C#/.NET/.NET Core定时任务调度的方法或者组件有哪些--Timer,FluentScheduler还是...
			
原文:C#/.NET/.NET Core定时任务调度的方法或者组件有哪些--Timer,FluentScheduler还是... 原文由Rector首发于 码友网 之 <C#/.NET/.NET ...
 - Vue 基础语法入门(转载)
			
使用vue.js原文介绍:Vue.js是一个构建数据驱动的web界面库.Vue.js的目标是通过尽可能简单的API实现响应式数据绑定和组合的视图组件.vue.js上手非常简单,先看看几个例子: 例一: ...
 - 生成二维码功能(js前端)
			
生成二维码需要引入qrcode.js和jquery.min.js <!DOCTYPE html> <head> <title>二维码</title> & ...
 - TS学习
			
随着vue3.0的即将到来,是时候学习一下TS了 简介:TypeScript是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类 ...
 - ios UICollectionView 加载数据后 滑动卡顿问题
			
最近项目的资源图片变大了,滑动时总是卡顿,在这里用NSOperationQueue解决了一下 .h 文件 @interface CollectionViewCell : UICollectionVie ...
 - (转) ESB 企业服务总线基本内容概述
			
ESB全称为Enterprise Service Bus,即企业服务总线. 它是传统中间件技术与XML.Web服务等技术结合的产物(SOAP协议= HTTP协议+ XML数据格式). ESB提供了网络 ...
 - java http httpclient
			
HttpClient post get 洗衣店 微信扫码支付
 - spring+mybatis事务配置(转载)
			
原文地址:http://blog.csdn.net/wgh1015398431/article/details/52861048 申明式事务配置步骤 .xml文件头部需要添加spring的相关支持: ...
 - 基于 maven 实现跨平台编译 protobuf 文件
			
基于 maven 实现跨平台编译 protobuf 文件 mavne protobuf .proto 跨平台 需求 在团队协作中使用 protobuf 时, 有以下几点需求: protoc 跨平台 ...