1,sqL注入安全问题;
由于传入的参数在拼接sqL语句时,其中注入了sqL能执行的指令作为参数导致执行的结果数据不正确,这种状况称为sqL注入安全问题 ;
数据表:
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class sqlInjectionProblem {
public static void main(String[] args) {
//根据用户名和密码查询用户
String real_name = "大哥";
String login_pwd = "123123 ";
getperson_Statement(real_name,login_pwd); }
/**
* sqL注入安全问题:
* 由于传入的参数在拼接sqL语句时,其中注入了sqL能执行的指令作为参数导致执行的结果数据不正确
*/
private static void getperson_Statement(real_name,login_pwd) {
Connection conn = null;
ResultSet rs = null;
Statement st = null;
conn= JDBCTools.getConn();
try {
st= conn.createStatement();
String sql = "select * from person where real_name= real_name and login_pwd =login_pwd";
rs= st.executeQuery(sql);
while (rs.next()){
User u = new User();
u.setEmployee_id(rs.getInt("employee_id"));
u.setLogin_id(rs.getString("login_id"));
u.setLogin_pwd(rs.getString("login_pwd"));
u.setReal_name(rs.getString("real_name"));
u.setEmail(rs.getString("email"));
u.setPhone(rs.getString("phone"));
u.setAddress(rs.getString("address"));
System.out.println(u); }
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
结果查询结果:
问题:全部查出,我们这里只是需要查出real_name = "大哥"; String login_pwd = "123123 ";中的表数据,查询结果确认全部显示。
2, 如何规避解决此问题: * 使用PrepareStatement这个接口就可以解决此类问题的发生: * 使用PrepareStatement对sqL进行预先编译,进行参数占位符?的检查,然后通过ps对象设置参数到占位符处,使用编译好的。
(* 使用PrepareStatement这个接口就可以解决此类问题的发生:)
import com.ltx.entity.User;
import com.ltx.util.JDBCTools;
import java.sql.*;
public class sqlInjectionProblem {
public static void main(String[] args) {
//根据用户名和密码查询用户
String real_name = "小兰兰";
String login_pwd = "1231234";
getperson(real_name,login_pwd);//使用PrepareStatement
}
/**
* 使用PrepareStatement这个接口就可以解决此类问题的发生:
* 注意:
* 设置的索引总是从1开始
*/
private static void getperson(String real_name,String login_pwd) {
Connection conn = null;
PreparedStatement pr = null;
ResultSet rs = null;
try {
conn= JDBCTools.getConn();
String sql = "select * from person where real_name= ? and login_pwd =?";
pr= conn.prepareStatement(sql);
//给编译过的sql进行占位符的赋值
pr.setString(1,real_name);
pr.setString(2,login_pwd);
rs= pr.executeQuery();
while (rs.next()){
User u = new User();
u.setEmployee_id(rs.getInt("employee_id"));
u.setLogin_id(rs.getString("login_id"));
u.setLogin_pwd(rs.getString("login_pwd"));
u.setReal_name(rs.getString("real_name"));
u.setEmail(rs.getString("email"));
u.setPhone(rs.getString("phone"));
u.setAddress(rs.getString("address"));
System.out.println(u); }
} catch ( Exception e) {
e.printStackTrace();
}
}
结果查询结果。: