导致sql注入的根本原因以及Statement与PreparedStatement的区别

本文探讨了SQL注入的定义,演示了如何通过不当输入绕过验证,重点介绍了PreparedStatement在预防注入中的关键作用。讲解了Statement与PreparedStatement的区别,以及何时选择Statement。
摘要由CSDN通过智能技术生成

何为sql注入?

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息

使用JDBC过程中出现SQL注入的问题

输入正确的账号和密码登陆成功

当使用sql注入时,错误的密码也能登陆成功,这就是sql注入
在这里插入图片描述

导致sql注入的根本原因

用户输入的信息中含有sql语句的关键字,并且这些关键字参与sql语句的编译过程。
导致sql语句的原意被扭曲,进而达到sql注入.

程序内的sql语句

String sql = "select * from t_user
 where username = '"+userLoginInfo.get("loginName")+"' and password = '"+userLoginInfo.get("loginPwd")+"'";

当输入

as’ or ‘1’ = '1
对该程序debug
可以看到该语句为true,系统就认为输入的密码是正确的,sql语句的原意被扭曲,从而达到sql注入

select * from t_user where username = '123' and password = 'as' or '1' = '1'

在这里插入图片描述

解决SQL注入问题:

只要用户提供的信息不参与sql语句的编译过程,问题就解决了
即用户提供的信息中含有sql语句的关键字,但是没有参与编译,不起作用
要想用户信息不参与SQL语句的编译,那么必须使用java.sql.PreparedStatement
PreparedStatemeent接口继承 java.sql.Statement
PreparedStatement是属于预编译的数据库操作对象
PreparedStatement的原理是:预先对SQL语句的框架进行编译,再给SQL语句传“值”

使用Statement获取数据库操作对象

			//获取数据库操作对象
            stmt = conn.createStatement();
            //执行sql语句
            String sql = "select * from t_user where username = '"+userLoginInfo.get("loginName")+"' and password = '"+userLoginInfo.get("loginPwd")+"'";
            rs = stmt.executeQuery(sql);

解决SQL注入的关键:用户提供的 信息中即使含有sql语句的关键字,但是这些关键字并没有参与编译,不起作用

使用PreparedStatement获取预编译的数据库操作对象

 			//获取预编译的数据库操作对象
            //其中一个?,表示一个占位符,一个?将来接收一个“值”,占位符不能使用单括号括起来
            String sql = "select * from t_user where username = ? and password = ?";
            //程序执行到此处,会发送sql语句框子给DBMS,进行对sql语句的预先编译。
            ps = conn.prepareStatement(sql);
            //给占位符?传值,(第1个问号下标是1,第二个问号下标是2.JDBC中所有下标从1开始。)
            ps.setString(1,loginName);
            ps.setString(2,loginPwd);

最后Statement与PreparedStatement区别

Statement存在SQL注入问题,PrepareStatement解决了SQL注入问题
Statement是编译一次执行一次。PreparedStatement是编译一次,可执行N次。PreparedStatement效率更高一些
PreparedStatement会在编译阶段做类型的安全检查

什么情况下必须使用Statement?
业务方面必须支持SQL注入的时候
Statement支持SQL注入,凡是业务方面要求是需要进行sql语句拼接的,必须使用Statement。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值