SQL注入
用户输入的内容, 在SQL语句拼接过程中, 完成了一条逻辑发生变化的新的SQL语句 !
例如:
原SQL语句拼接为:
String sql = "select id from user15 where username='"+user.getUserName()+"' and password='"+user.getPassWord()+"'";
用户输入的帐号密码分别为:
请输入您的帐号:
suibian
请输入您的密码:
suibian' or '1'='1
组成的SQL语句:
select id from user15 where username='suibian' and password='suibian' or '1'='1'
解决SQL注入问题
使用预编译SQL语句 进行参数的传递
更改执行环境 Statement
使用新的环境: PreparedStatement
在通过连接对象 获取一个预编译的SQL环境(PreparedStatement)时, 需要传递 一个SQL语句 !
在这个语句中 可以出现? , ? 表示准备填充的参数值!
使用步骤:
1. 通过连接对象, 获得一个预编译的SQL执行环境
PreparedStatement state conn.prepareStatement(sql);
例如:
String sql = "select id from user15 where username=? and password=?";
PreparedStatement state = conn.prepareStatement(sql);
2. 向预编译参数列表中 传递值:
预编译的SQL语句中可以包含0-n个问号, 每一个问号表示一个需要传递的值
我们通过PreparedStatement它的setXXX方法,来完成参数的传递
在传递参数时, 需要指定问号的索引, 问号的索引从1开始
例如:
state.setString(1,user.getUserName());
state.setString(2,user.getPassWord());
3. 执行语句:
ResultSet result = state.executeQuery();
PreparedStatement
常用方法:
填充预编译的参数:
- setXXX(问号索引,值)
向预编译的SQL的?中传递值
参数1. 问号的索引 ,从1开始
参数2. 填充到? 中的值
- execute()
- executeUpdate();
- executeQuery();
上面的三个方法 与 Statement中方法的含义一致, 只不过不存在参数!