' or ' 1 ' = ' 1
原理:通过违规的字符串改变原来的SQL语句 ;【将敏感字符进行转义】
// 包名 package com.zhulx.JDBC; // 导入实例类 import com.zhulx.pojo.Account; import java.sql.*; import java.util.ArrayList; import java.util.List; /** * JDBC 快速入门 * **/ public class JDBC03 { // throws Exception 说明此方法不会处理异常 public static void main(String[] args) throws Exception { // TODO 用户登录逻辑判断 // 用户登录 // 2. 获取连接 【 就是关联数据库 】 访问 test 数据库 String url = "jdbc:mysql://127.0.0.1:3306/tb_user"; String username = "root"; String password = "abc123"; Connection conn = DriverManager.getConnection(url, username, password); // 前端用户输入的用户名和密码 // 单引号是字符 双引号是字符串 String name = "zhulongxu"; String pwd = "123456"; name = "dasfjalhsdf"; pwd = "' or ' 1 ' = ' 1 "; // 3. 定义 sql DQL // String sql = "select * from user_table where username='"+name+"' and password = '"+pwd+"'"; // 3. prepareStatment定义 SQL 语句的写法 String sql = "select * from user_table where username = ? and password = ?"; // 4. 获取执行 sql 对象 statement // Statement stmt = conn.createStatement() ; // 4. prepareStatment 获取 pstmt 对象 PreparedStatement pstmt = conn.prepareStatement(sql); // 5. 设置 ? 的值 1 2 都是参数索引, 1 表示第一个 ? // 原来 ' or ' 1 ' = ' 1 的字符串通过 prepareStatement 把单引号转义了 ‘/’ 就不再是违法的字符串了【‘】 pstmt.setString(1, name); pstmt.setString(2,pwd); // SQL 注入原理:就是通过字符串的拼接和关键字符串把原本的SQL语句给改变了 // prepareStatement 的作用:避免SQL注入攻击 // 5. 执行 sql 【返回值是受影响的行数】 // ResultSet rs = stmt.executeQuery(sql); // 5. preparestatement 执行 sql ResultSet rs = pstmt.executeQuery(); // 6. 判断是否登录成功 如果在数据库找到了这个用户说明登录成功 rs.next() 是否获取到了数据 // // System.out.println(rs.next()); // true if(rs.next()) { System.out.println(name); System.out.println(pwd); System.out.println(sql); System.out.println("登录成功"); }else { System.out.println(name); System.out.println(pwd); System.out.println("登录失败"); } // 7. 释放资源 pstmt.close(); conn.close(); rs.close(); } }
标签:String,SQL,System,println,sql,解决,out,注入 From: https://www.cnblogs.com/zhulongxu/p/17229359.html