SQL注入:输入用户名和密码的时候带有SQL语句的关键字,会导致SQL注入;
用户是一个专业程序员,输入用户名和密码的时候,这些信息中包含了SQL语句的关键字,并且这些关键字参与了编译过程,导致原SQL语句含义被扭曲;
SQL注入是存在的一种安全隐患
怎么解决SQL注入问题( 导致SQL的根本原因是什么 )?
原因是先进行字符串拼接再进行的编译导,正好将用户提供的含有SQL语句关键字的字符串编译进去,从而导致了SQL语句的原意,致SQL注入;
解决办法:
(第一版) -- 先体统SQL语句架构,对SQL语句框架进行预先编译,再给SQL语句框架进行赋值,这样即使用户提供的信息中含有SQL语句的关键字,但是这些关键字并不会参与编译,不起作用,解决SQL注入问题.
(第二版) -- java.sql.PreparedStatement (预编译的数据库操作对象)
PreparedStatement 的父接口 :Statement
执行原理 : 先提供SQL语句框架,再使用预编译的数据库操作对象进行SQL语句的预先编译,再给SQL语句框架传值,传值的时候用户输入的信息中即使有SQL语句的关键字也不会参与编译,不会扭曲远SQL语句的含义;
String sql = ‘select * from u_user where userName = ? and passWord = ?’;
框架SQL语句,只有一个架子没有具体的值,每一个 ? 都是一个占位符,第一个占位符的下标是1,第二个占位符的下标是2
PrepareStatement ps = xxx.preparestatement(sql);
将上面的SQL框架语句进行预先编译
Ps.setString(1,username); //给占位符赋值
Ps.setString(2,password); //给占位符赋值
总结 : Statement 和 PreparedStatement对比
Statement存在SQL注入问题,PreparedStatement可以避免
PreparedStatement使用较多
当有些系统需要SQL注入的时候就选择statement
Statement和PreparedStatement效率比较
Statement特点是编译一次执行一次,编译n次执行n次
PreparedStatement特点是编译一次,执行n次
PreparedStatement速度要优于statement