PreparedStatement能防止sql注入的原理

Class.forName(com.mysql.jdbc.Driver);
Connection con = DriverManager.getConnection("jdbc:mysql://....");
Statement st = con.CreateStatement();
String id = "03";
String sq = "delete from table1 where id="+id;
st.execute(sq);

上面这段代码的本意是要删除id=03的记录,但是如果有人将id的内容改为“03 or 1=1”。
那么表中的任何记录都将被删除,后果十分严重。
而且登录界面用户可以在输入的时候加上两个冒号作为特殊字符,
这样的话会让计算机认为他输入的是SQL语句的关键字从而改变你的SQL语句,
造成不可估量的损失。
这是Statement的一大缺点:不能防止sql注入。
另一个缺点是,每次执行都需要重新编译sql语句,效率低下。
而PreparedStatement则解决了这些问题。

为什么PreparedStatement能防止sql注入呢?
因为sql语句是预编译的,而且语句中使用了占位符,规定了sql语句的结构。
用户可以设置"?"的值,但是不能改变sql语句的结构,
因此想在sql语句后面加上如“or 1=1”(1=1能查出全部用户)等奇怪字符串的拼接来实现sql注入是行不通的。
实际开发中,一般采用PreparedStatement访问数据库,它不仅能防止sql注入,
还是预编译的(不用改变一次参数就要重新编译整个sql语句,效率高),
此外,它执行查询语句得到的结果集是离线的,连接关闭后,仍然可以访问结果集。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

征程123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值