권장(무료): sql tutorial
SQL 주입이란 웹 애플리케이션이 사용자 입력 데이터의 적법성을 판단하지 않거나 이를 엄격하게 필터링하지 않는다는 의미입니다. 공격자가 웹에서 이를 미리 정의할 수 있습니다. 응용 프로그램 쿼리문 끝에 추가 SQL 문을 추가하여 관리자가 모르는 사이에 불법적인 작업을 수행함으로써 데이터베이스 서버를 속여 승인되지 않은 임의 쿼리를 실행함으로써 해당 데이터 정보를 추가로 얻을 수 있습니다.
1. SQL 주입 사례
사용자가 콘솔에 사용자 이름과 비밀번호를 입력한 후 명령문 문자열 연결을 사용하여 사용자 로그인을 구현하는 경우를 시뮬레이션합니다.
1.1 먼저 데이터베이스에 사용자 테이블과 데이터를 생성합니다
-- 创建一张用户表 CREATE TABLE `users` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `username` VARCHAR(20), `password` VARCHAR(50), PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8; -- 插入数据 INSERT INTO users(username,`password`) VALUES('张飞','123321'),('赵云','qazxsw'),('诸葛亮','123Qwe'); INSERT INTO users(username,`password`) VALUES('曹操','741258'),('刘备','plmokn'),('孙权','!@#$%^'); -- 查看数据 SELECT * FROM users;
1.2 로그인 프로그램 작성
import java.sql.*; import java.util.Scanner; public class TestSQLIn { public static void main(String[] args) throws ClassNotFoundException, SQLException { Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=UTF-8"; Connection conn = DriverManager.getConnection(url,"root","123456"); //System.out.println(conn); // 获取语句执行平台对象 Statement Statement smt = conn.createStatement(); Scanner sc = new Scanner(System.in); System.out.println("请输入用户名:"); String userName = sc.nextLine(); System.out.println("请输入密码:"); String password = sc.nextLine(); String sql = "select * from users where username = '" + userName + "' and password = '" + password +"'"; //打印出SQL System.out.println(sql); ResultSet resultSet = smt.executeQuery(sql); if(resultSet.next()){ System.out.println("登录成功!!!"); }else{ System.out.println("用户名或密码错误,请重新输入!!!"); } resultSet.close(); smt.close(); conn.close(); } }
1.3 정상적으로 로그인합니다
사용자 이름과 비밀번호를 정확하게 입력한 후, "로그인 성공" 메시지가 표시됩니다. "
1.4 로그인 실패
잘못된 사용자 이름이나 비밀번호를 입력하면 "사용자 이름이나 비밀번호가 잘못되었습니다. 다시 입력하세요"라는 메시지가 표시됩니다
1.5 SQL 인젝션 시뮬레이션
접속된 문자열 상수 성립 조건에 '1'='1'이 있으므로 이전 사용자와 비밀번호가 없어도 모든 기록을 가져오므로 "Login" 프롬프트가 뜹니다. 성공"
1.6 SQL 구문 오류
사용 스플라이싱 방법은 SQL 구문 오류 및
2와 같은 기타 오류도 발생시킵니다. 해결 방법
Statement 방법을 사용하면 사용자는 다음을 수행할 수 있습니다. 문자열 접합을 통해 원본 SQL의 실제 의미를 변경하여 SQL 주입 위험을 초래합니다. SQL 인젝션을 해결하려면 처리를 위해 State 대신 전처리 개체인 ReadyStatement를 사용할 수 있습니다.
1.1 새 프로그램 작성
import java.sql.*; import java.util.Scanner; public class TestSQLIn { public static void main(String[] args) throws ClassNotFoundException, SQLException { Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=UTF-8"; Connection conn = DriverManager.getConnection(url,"root","123456"); //System.out.println(conn); // 获取语句执行平台对象 Statement // Statement smt = conn.createStatement(); Scanner sc = new Scanner(System.in); System.out.println("请输入用户名:"); String userName = sc.nextLine(); System.out.println("请输入密码:"); String password = sc.nextLine(); String sql = "select * from users where username = ? and password = ? "; // System.out.println(sql); // ResultSet resultSet = smt.executeQuery(sql); PreparedStatement preparedStatement = conn.prepareStatement(sql); preparedStatement.setString(1,userName); preparedStatement.setString(2,password); ResultSet resultSet = preparedStatement.executeQuery(); if(resultSet.next()){ System.out.println("登录成功!!!"); }else{ System.out.println("用户名或密码错误,请重新输入!!!"); } preparedStatement.close(); resultSet.close(); // smt.close(); conn.close(); } }
2.2 정상적으로 로그인
2.3 사용자 이름과 비밀번호가 정확하지 않습니다
사용자 이름이나 비밀번호를 잘못 입력하면 "사용자 이름이나 비밀번호가 잘못되었습니다"라는 메시지가 나타납니다. , 재입력해주세요”
2.4 SQL 주입 시뮬레이션
이전 상황에 따라 SQL 주입을 작성하고 테스트 후에는 더 이상 SQL 주입이 발생하지 않습니다.
2.5 SQL 구문 오류 시뮬레이션
전처리 클래스를 사용한 후 작은따옴표나 큰따옴표로 내용을 입력해도 더 이상 SQL 구문 오류가 발생하지 않습니다
3 의 주요 차이점은 다음과 같습니다.
Statement 및PrepareStatement는 다음과 같습니다.위 내용은 SQL 주입 및 해결 방법 알아보기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!