解决登录时sql注入的方法:预编译时放入sql(java)

1、 使用import java.sql.PreparedStatement;

2、先将sql里用户名和密码分别用?占位,先预编译将sql放入PreparedStatement的对象中。

然后用调用该对象的set方法将用户名和密码设置,接着执行。

3、这样做的话如果密码被注入为 or 1 = 1,在设置密码时会将转义为;即:

select * from tb_user where username =lisi and password =  or 1 = 1

由此or后面的语句为false,注入失败,登录不成功,避免了sql注入。

import org.junit.jupiter.api.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;


public class JDBC_UserLogin_SolveSqlZhuRu {

    @Test
    public void testSolveSqlZhuRu() throws Exception {

        /*jdbc驱动*/
        Class.forName("com.mysql.jdbc.Driver");

        String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false&useServerPrepStmts=true";
        String username = "root";
        String password = "root";/*获取数据库连接*/
        Connection connection = DriverManager.getConnection(url,username,password);

        /*模拟接收用户名和密码*/
        String name = "lisi";
        String pwd = " or 1 = 1";

        /*定义sql语句*/
        String sql = "select * from tb_user where username = ? and password = ?";

        /*获取PreparedStatement对象,预编译,提前将sql放入*/
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        /*设置?的值*/
        preparedStatement.setString(1,name);
        preparedStatement.setString(2,pwd);

        /*执行sql*/
        ResultSet resultSet = preparedStatement.executeQuery();

        if (resultSet.next()){
            System.out.println("登录成功");
        }else{
            System.out.println("登录失败");
        }

        /*关闭服务,释放资源*/
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }
}
经验分享 程序员 微信小程序 职场和发展