JDBC入门七:SQL注入攻击:SQL注入攻击的解决策略:PreparedStatement预编译SQL;

接上篇博客,沿用JDBC入门五:一个按部门查询员工功能的例子这篇博客中的案例代码;

采用PreparedStatement的策略,能够解决SQL注入攻击的问题。

目录

1.PreparedStatemen简介 

2.PreparedStatement和Statement比较

(1)Statement:

(2)PreparedStatement:

3.PreparedStatement案例

(1)PstmtQueryCommand编写

(2)运行

4.为什么使用参数化SQL的方式比拼接字符串的方式更加高效?(即为什么使用PrepareStatement的方式?)

5:SQL传参中几种错误的使用方式


1.PreparedStatemen简介 

PreparedStatement:预编译Statement,其目的是解决SQL注入攻击的问题。

PreparedStatement:

        (1)PreparedStatement本质也是一个接口,只是其继承自Statement接口;专用于对SQL语句进行预处理以后再去执行;

        (2)在实际工作中,推荐使用PreparedStatement;


2.PreparedStatement和Statement比较

(1)Statement:

(2)PreparedStatement:

PreparedStatement用法和Statement用法差别还是挺大的;

        (1)sql中的?相当于是一个参数,这个参数是需要PreparedStatement进行解析的;PreparedStatement对象提供了set***()方法来设置参数;

        (2)【setString(1,dname)】中的1代表传入第一个参数,值为dname;

        (3)PreparedStatement的作用是:【对sql进行预处理】,并且【对字符串中诸如单引号这样的特殊字符进行转义处理】,所以在执行的时候最终的SQL就变成了:

select * from employee where dname='\' or 1=1 or 1=\''

而其中,dname的值就是:【\' or 1=1 or 1=\'】(也就是' or 1=1 or 1='这个字符串),即dname是这个整个字符串,(这个字符串不会被作为SQL语句的一部分了,只是作为一个变量的值而已)所以最终就是查询不到任何结果;从而避免了注入攻击的情况。

        (4)总结一下:即PreparedStatement根本就是,在SQL执行前进行参数化的处理,通过?将原有需要传入变量的部分,变成在下面通过set***(1,dname)通过参数进行传入的形式,同时对参数中的特殊字符进行转义的处理;


3.PreparedStatem

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值