>  기사  >  데이터 베이스  >  SQL 주입 및 해결 방법 알아보기

SQL 주입 및 해결 방법 알아보기

coldplay.xixi
coldplay.xixi앞으로
2021-01-28 18:17:453299검색

SQL 주입 및 해결 방법 알아보기

권장(무료): 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;

SQL 주입 및 해결 방법 알아보기

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 정상적으로 로그인합니다

사용자 이름과 비밀번호를 정확하게 입력한 후, "로그인 성공" 메시지가 표시됩니다. "

SQL 주입 및 해결 방법 알아보기

1.4 로그인 실패

잘못된 사용자 이름이나 비밀번호를 입력하면 "사용자 이름이나 비밀번호가 잘못되었습니다. 다시 입력하세요"라는 메시지가 표시됩니다

SQL 주입 및 해결 방법 알아보기

1.5 SQL 인젝션 시뮬레이션

접속된 문자열 상수 성립 조건에 '1'='1'이 있으므로 이전 사용자와 비밀번호가 없어도 모든 기록을 가져오므로 "Login" 프롬프트가 뜹니다. 성공"

SQL 주입 및 해결 방법 알아보기

1.6 SQL 구문 오류

사용 스플라이싱 방법은 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 정상적으로 로그인

SQL 주입 및 해결 방법 알아보기

2.3 사용자 이름과 비밀번호가 정확하지 않습니다

사용자 이름이나 비밀번호를 잘못 입력하면 "사용자 이름이나 비밀번호가 잘못되었습니다"라는 메시지가 나타납니다. , 재입력해주세요”

SQL 주입 및 해결 방법 알아보기

2.4 SQL 주입 시뮬레이션

이전 상황에 따라 SQL 주입을 작성하고 테스트 후에는 더 이상 SQL 주입이 발생하지 않습니다.

SQL 주입 및 해결 방법 알아보기

2.5 SQL 구문 오류 시뮬레이션

전처리 클래스를 사용한 후 작은따옴표나 큰따옴표로 내용을 입력해도 더 이상 SQL 구문 오류가 발생하지 않습니다

SQL 주입 및 해결 방법 알아보기

3 의 주요 차이점은 다음과 같습니다.

Statement 및PrepareStatement는 다음과 같습니다.

  • Statement는 정적 SQL 문을 실행하는 데 사용됩니다. 실행 중에 준비된 SQL 문을 지정해야 합니다.

  • PrepareStatement는 문에 동적을 포함할 수 있습니다. 매개변수 "?"를 사용하고 실행 중에 "?"에 대한 매개변수 값을 동적으로 설정할 수 있습니다

  • PrepareStatement는 컴파일 횟수를 줄이고 데이터베이스 성능을 향상시킬 수 있습니다

위 내용은 SQL 주입 및 해결 방법 알아보기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제