关于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 ...
随机推荐
- Layui数据表格模型
视图模型 package com.meiyou.model; import org.springframework.context.annotation.Bean; import java.io.Se ...
- python-2:爬取某个网页(虎扑)帖子的标题做词云图
关键词:requests,BeautifulSoup,jieba,wordcloud 整体思路:通过requests请求获得html,然后BeautifulSoup解析html获得一些关键数据,之后通 ...
- [WPF]鼠标位置捕捉
private void StackPanel_MouseMove(object sender, MouseEventArgs e) { Debug.WriteLine("Move& ...
- Mysql数据库中的输入命令各类知识总结
1.链接数据库的命令---mysql-u root-p 回车,输入密码//在cmd上输入自己的账号密码 2.查看:show databases: 3.创建数据库:create +database+数据 ...
- vue中获取本地ip
一.目的 获取当前访问的ip地址 二.思路 通过使用搜狐的api获取访问ip 三.操作步骤 1.在index.html中添加 <script src="http://pv.sohu.c ...
- ajax传输数组类型的参数
$.ajax({ type:"post", traditional: true, data:{arr:arr}, url:"${pageContext.request.c ...
- Haproxy学习总结
一.Haproxy介绍 1.实现了一种事件驱动,单一进程模型,支持数万计的并发连接,用于为tcp和http应用程序提供高可用,负载均衡和代理服务的解决方案,尤其适用于高负载且需要持久连接或7层处理机制 ...
- 查看 apache 的编译参数
cat /home/oldboy/run/apache/build/config.nice 范例 2: [root@VM-002 ~]# cat /home/oldboy/run/apache/bui ...
- RHEL7使用systemctl管理服务
1. systemctl命令 说明 systemctl start [unit type] 启动服务 systemctl stop [unit type] 停止服务 syste ...
- Codeforces Round #575 (Div. 3) (A. Three Piles of Candies)(数学)
A. Three Piles of Candies time limit per test1 second memory limit per test256 megabytes inputstanda ...