一、什么是sql注入?

看下面的两种情况:

第一种情况

9ad1559ecf52fce2ae219a07b48b0634.png

第一种情况变成的代码:

528546efca146a5f1090880a1ae19c28.png

这上面即使是没有密码也是可以登录上去的。

这些情况就是sql注入

总结:由于dao中执行的SQL语句是拼接出来的,其中有一部分内容是由用户从客户端传入,所以当用户传入的数据中包含sql关键字时,就有可能通过这些关键字改变sql语句的语义,从而执行一些特殊的操作,这样的攻击方式就叫做sql注入攻击

二、如何解决?

为了解决这个问题,我们先来了解一个类

35aeaeb680d2a59681d2d81de425afa3.png

这个preparedstatement是statement类的子类,它有一个功能就是可以预编译

下面建一个JDBCDemo3.java

package com.javaweb.dao;

import com.javaweb.util.JDBCUtils;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

public class JDBCDemo3 {

public static void main(String[] agrs){

Connection conn=null;

PreparedStatement ps=null;

ResultSet rs=null;

try {

conn=JDBCUtils.getConn();

ps=conn.prepareStatement("select * from users where username=? and password=?");

} catch (Exception e) {

e.printStackTrace();

}finally{

JDBCUtils.close(rs, ps,conn);

}

}

}

045e21fdf673f6e241537ed513f2f9ae.png

下面先介绍一个工具,这是mysql的工具

b2e321fbf8d9aedf572395eefdbff715.png

连接数据库

37f934487883c91ca3774f8984bf6d0c.png

打开表

cdcd19f6b86e666c45def5e6263dcda7.png

新插入一个数据记录

1934d3530ada795a4f02817920b2f4e9.png

可以在cmd窗口查询

418e8bdab32fa52764163cfd4a1a403b.png

除了cmd窗口,这个软件也提供另外一个窗口

b716fa40c01d50cc053158ee05eba6a7.png

介绍完工具以后,继续完善JDBCDemo3.java

下面是代码:

package com.javaweb.dao;

import com.javaweb.util.JDBCUtils;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

public class JDBCDemo3 {

public static void main(String[] agrs){

Connection conn=null;

PreparedStatement ps=null;

ResultSet rs=null;

try {

conn=JDBCUtils.getConn();

ps=conn.prepareStatement("select * from users where username=? and password=?");

ps.setString(1, "zs");

ps.setString(2, "999");

rs=ps.executeQuery();

while(rs.next()){

System.out.println(rs.getString("email"));

}

} catch (Exception e) {

e.printStackTrace();

}finally{

JDBCUtils.close(rs, ps,conn);

}

}

}因为要将 MySqlUserDao中的Statement改用PreparedStatement类,这时候我们新建一个 MySqlUserDao2

package com.javaweb.dao;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.Statement;

import com.javaweb.domain.User;

import com.javaweb.util.JDBCUtils;

public class MySqlUserDao2 implements UserDao{

public void addUser(User user) {

String sql="insert into users valuses(null,?,?,?,?)";

Connection conn=null;

PreparedStatement ps=null;

ResultSet rs=null;

try {

conn=JDBCUtils.getConn();

ps=conn.prepareStatement(sql);

ps.setString(1, user.getUsername());

ps.setString(2, user.getPassword());

ps.setString(3, user.getNickname());

ps.setString(4, user.getEmail());

} catch (Exception e) {

e.printStackTrace();

throw new RuntimeException(e);

}finally{

JDBCUtils.close(rs, ps, conn);

}

}

public User findUserByUNandPSW(String username, String password) {

String sql = "select * from users where username=? and password=?";

Connection conn=null;

PreparedStatement ps=null;

ResultSet rs=null;

try{

conn = JDBCUtils.getConn();

ps = conn.prepareStatement(sql);

ps.setString(1, username);

ps.setString(2, password);

rs = ps.executeQuery(sql);

if(rs.next()){

User user = new User();

user.setId(rs.getInt("id"));

user.setUsername(rs.getString("username"));

user.setPassword(rs.getString("password"));

user.setNickname(rs.getString("nickname"));

user.setEmail(rs.getString("email"));

return user;

}else{

return null;

}

}catch (Exception e) {

e.printStackTrace();

throw new RuntimeException(e);

}finally{

JDBCUtils.close(rs, ps, conn);

}

}

public User findUserByUserName(String username) {

String sql = "select * from users where username=?";

Connection conn=null;

PreparedStatement ps=null;

ResultSet rs=null;

try{

conn = JDBCUtils.getConn();

ps = conn.prepareStatement(sql);

ps.setString(1, username);

rs = ps.executeQuery(sql);

if(rs.next()){

User user = new User();

user.setId(rs.getInt("id"));

user.setUsername(rs.getString("username"));

user.setPassword(rs.getString("password"));

user.setNickname(rs.getString("nickname"));

user.setEmail(rs.getString("email"));

return user;

}else{

return null;

}

}catch (Exception e) {

e.printStackTrace();

throw new RuntimeException(e);

}finally{

JDBCUtils.close(rs, ps, conn);

}

}

}再在配置文件中配置,就大功告成了

80137370d126d47cfc7c05f5db7cc14c.png

这时候就完成了。