sql注入问题

原创
2015/10/07 19:34
阅读数 483

sql注入:在页面中输入sql的片段。达到篡改程序中sql语句。

 正常情况:

select * from user where username='zhangsan' and password = '123456';

当sql被注入之后的语句:

select * from user where username='zhangsan' and password = '' or '1'='1'

 造成系统的不安全不保密。

解决方案:

sql进行预编译处理,sql的格式固定。可以放置预编译。

PrepareStatment 进行了预编译的处理,当下次执行相同格式的sql的时候,sql不会在进行编译。比statement的效率高。

statement每执行一次sql进行一次编译。

注意:sql提前创建好的。sql语句中需要参数。使用?进行站位。

举例:

select *from user where username=zhangsan and password = 123456;

使用?进行站位

 select * from user where username=? and password=?

 1conn.prepareStatement(sql); -----需要你事先传递sql。如果sql需要参数,使用?进行占位。

 2设置参数(执行sql之前):prepStmt.setXXX(int index, 要放入的值) -----根据不同类型的数据进行方法的选择。第一个参数表示的是?出现的位置。从1开始计数

有几个问号,就需要传递接个参数。

方法的参数说明:

第一个参数:int index ;表示的是问号出现的位置。 问号是从1开始计数

第二个参数:要问号的位置传入的值。

 3执行,不需要在传递sql了。

   prepStmt.executeQuery();---执行select

   prepStmt.executeUpdate();---执行insertdeleteupdate

prepardeStatement的优点:

PreparedStatementStatement的子接口,它的实例对象可以通过调用Connection.preparedStatement(sql)方法获得,相对于Statement对象而言:

PreperedStatement可以避免SQL注入的问题。

Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。PreparedStatement 可对SQL进行预编译,从而提高数据库的执行效率。

并且PreperedStatement对于sql中的参数,允许使用占位符的形式进行替换,简化sql语句的编写。方便阅读。

    使代码的可读性更高。

 以后在企业中几乎都是用PreparedStatement


展开阅读全文
加载中
点击加入讨论🔥(1) 发布并加入讨论🔥
1 评论
0 收藏
0
分享
返回顶部
顶部