Sql注入:由于JDBC程序在执行的过程中sql语句在拼装时使用了页面传入参数,如果用户恶意传入一些sql中的特殊关键字,会导致sql语句意义发生变化,这种攻击方式就叫做sql注入;
如:某网站登录用户名为 张三 密码为 123
后台数据库验证用户时有sql语句 select * from user where username = ' 张三' and password = '123';
若其他人知道你的用户名是张三 则 可以输入 用户名为 张三’# 密码为空
则在后台执行sql语句时sql语句变为select * from user where username = ‘张三‘#’ and password = ’‘;
由于在sql语句中#会将后边的sql语句注释掉,结果登录成功。用户受到攻击
Sql注入解决方案:
将JDBC代码中的Statement 换成 PreparedStatement
PreparedStatement是Statement的孩子,不同的是:
PreparedStatement使用预编译机制,在创建PreparedStatement对象时就需要将sql语句传入,传入的过程 中参数要用?替代,这个过程会导致传入的sql被进行预编译,然后再调用PreparedStatement的setXX 将参数设置上去,由于Sql语句已经经过了预编译,再传入特殊值也不会起作用了。
PreparedStatement使用了预编译机制,sql语句在执行的过程中效率比Statement要高。