案例: 演示通过PreparedStatement接口的预编译功能 解决 SQL注入攻击问题.
SQL注入攻击问题的产生原因:
因为用户录入的非法字符, 符号, 单词等, 被我们的SQL语句识别为关键字了, 从而修改了我们SQL语句的格式, 从而造成了安全隐患.
SQL注入攻击问题的解决思路:
采用 预编译思路 解决, 即: 预先对SQL语句进行一次编译, 把需要用户填充的地方用 占位符标记上, 之后不管用户传入什么内容,
都只是采用 普通的字符来处理, 并不会被识别为关键词, 这样就避免了 SQL注入攻击问题.
PreparedStatement解释:
概述:
它是一个接口, 也是 Statement接口的子接口, 它具有 预编译功能.
成员方法:
public void setXxx(int index, Xxx value); 给指定的占位符填充值. Xxx表示数据类型.
*/
public class Demo02 {
public static void main(String[] args) throws Exception {
//1. 提示用户录入他/她的账号和密码, 并接收.
Scanner sc = new Scanner(System.in);
System.out.println("请录入您的账号: ");
String username = sc.nextLine();
System.out.println("请录入您的密码: ");
String password = sc.nextLine();
//2. 获取连接对象.
Connection conn = JDBCUtils.getConnection();
//3. 获取可以执行SQL语句的对象, PreparedStatement(具有预编译功能)
String sql = "select * from users where username=? and password=?;"; // ? 表示占位符
PreparedStatement ps = conn.prepareStatement(sql);
//具体执行SQL语句之前, 需要给占位符 填充值.
ps.setString(1, username);
ps.setString(2, password);
//4. 执行SQL语句, 获取结果集.
ResultSet rs = ps.executeQuery();
//5. 判断结果集是否为空.
//不为空, 说明查询到数据了, 则表示: 登陆成功.
//否则, 登陆失败.
System.out.println(rs.next() ? "登陆成功, 欢迎您 " + username : "登陆失败, 用户名或者密码错误!");
//6. 释放资源.
JDBCUtils.release(conn, ps, rs);