解决登录时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(); } }