0
点赞
收藏
分享

微信扫一扫

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

墨春 2022-03-12 阅读 73

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();
    }
}

 

举报

相关推荐

0 条评论