微笑的乌冬面浅谈:SQL注入漏洞
在程序的实际使用中,为了管理庞大的数据信息,就会使用到数据库。用户在使用程序时,程序可以自动通过自动对数据库的查询,而我认为的注入漏洞即是通过一些查询数据库的语句来实现。
下面一段代码来演示SQL注入漏洞的原理:
public static void main(String[] args) throws SQLException {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名");
String username = scanner.nextLine();
System.out.println("请输入密码");
String password = scanner.nextLine();
//假设username=zhangsan password= 123456
//下述字符串查询语句可以携程select * from user where username=zhnagsan password=123456
//下面代码有注入漏洞
//String sql = "select * from user where username='" + username+"'and password='"+password+"'";
//下面一行代码是实现查询数据库数据的代码,其中有我自己创造的工具类等,读者不必深究,知道即可。
//
/*List<Map<String, Object>> list = DBUtils.getMapList(sql);
//如果查询出来数据库有值,即说明查到的内容不为空,即登录成功
//这也是出现注入漏洞的地方,比如说你输入密码为 123 ' or ' 1=1 这样这个语句在我的查询数据库语句永远是真的,见上边四行//代码
if(list!=null&&list.size()>0){
System.out.println("登录成功");
}else {
System.out.println("登录失败");
}*/
//防止注入漏洞
User user = new DBUtils<User>(User.class).getBean(" username='"+username+"'");
if(user!=null && user.getPassword()!=null && password!=null && password.equals(user.getPassword())){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}