SQL漏洞注入攻击
使用statement进行sql处理存在安全隐患eg:
String sql = "select * from users where username='"+name+"' and password='"+password+"'";
stmt = conn.createStatement();
stmt.executeQuery(sql);
第一次登录:
请输入用户名: 赵本山
请输入密码: admin
登录成功
第二次登录:
请输入用户名: 赵本山
请输入密码: admin'or'1'='1
登录成功
SQL漏洞注入攻击:
原因:
1. 程序员在执行sql拼接的时候,直接把内容拼到SQL语句中.
2. 在执行的时候,正好被拼接成一条恒成立的语句,形成了一个漏洞.
解决办法:
1. 不能把语句参数直接写在SQL中.
2. 使用参数化查询.
使用preparedstatement处理sql
String sql = "select * from users where username=? and password=?";
ps = conn.prepareStatement(sql);
ps.setString(1,username);
ps.setString(2,password);
rs = ps.executeQuery();
第一次登录:
请输入用户名: 赵本山
请输入密码: admin
登录成功
第二次登录:
请输入用户名: 赵本山
请输入密码: admin'or'1'='1
登录失败
说明:
PreparedStatement接口(预编译的SQL语句)优点:
1. 有很高的代码可读性以及维护性.
2. 很大程度提高了SQL语句执行的性能.
3. 安全性能高,不容易遭到破解.