웹 양식 제출에 SQL 명령을 삽입하거나 페이지 요청에 대한 도메인 이름이나 쿼리 문자열을 입력하면 궁극적으로 서버를 속여 악성 SQL 명령을 실행하도록 할 수 있습니다. 구체적으로, 기존 애플리케이션을 이용해 (악성) SQL 명령을 백그라운드 데이터베이스 엔진에 주입해 실행함으로써 보안이 취약한 웹사이트의 데이터베이스를 확보한다.
SQL 인젝션, SQL 인젝션은 실제로 코드 취약점을 이용하여 SQL의 의미를 변경하여 악성 SQL 문을 형성합니다.
$username = $_POST['username']; $password = $_POST['password']; $query = "select * from users where username = '{$username}' and password = '{$password}'"; // 判断是否登录成功 if (DB::select($query)) { return true; } return false;
얼핏 보면 이 의사 코드에는 아무런 문제가 없습니다. 계정 비밀번호만 확인하는 것뿐입니다. 정확하고 true이면 로그인이 허용됩니다. 그러나 들어오는 사용자 이름이 123' 또는 1=1;#이면 SQL 문은
select * from users where username = '123' or 1=1; # and password = '{$password}'";
가 됩니다. 이 악성 SQL 문은 언제든지 true를 반환합니다. 왜냐하면 1=1
us를 통해 주입되기 때문입니다. 앞서 언급했듯이 , SQL 주입은 코드 취약점을 사용하여 SQL의 의미를 변경합니다. 이는 ORM이 잠재적인 주입 지점이기도 함을 의미합니다. tp3.2를 예로 들면 다음 코드가 있습니다
$result = D('User')->where([ 'username' => $_POST['username'], 'password' => $_POST['password'], ]); if ($result) { echo '登录成功'; } else { echo '登录失败'; }
이 코드는 문제가 없는 것 같지만, username이 username[0]=neq&username[1]=1111로 전달되면 쿼리 문은
$result = D('User')->where([ 'username' => ['neq', 111], 'password' => $_POST['password'], ]);
가 됩니다. 그러면 $result의 결과는 항상 true가 됩니다
수신 매개변수에 대한 데이터 유형 판단 및 데이터 유형 변환 수행
따옴표를 이스케이프 처리하고, PHP는 추가 래시, mysql_real_escape_string을 사용할 수 있습니다.
과 같은 함수 전처리 문은 SQL 주입을 방지하는 가장 효과적인 방법입니다
코드 감사
전처리 문은 MySQL과 같은 데이터베이스에서 구현됩니다. 먼저 전처리의 기본 과정에 대해 이야기해보겠습니다
MySQL은 전처리된 SQL 템플릿을 수신하고 즉시 구문 분석(어휘 및 구문)을 시작합니다
클라이언트는 SQL 템플릿의 자리 표시자(?)를 대체하기 위해 데이터를 보냅니다
MySQL은 문을 실행하고 결과를 반환합니다.
Prepared 문 삭제(선택 사항)
그럼 준비된 문은 어떻게 SQL 주입을 방지할까요? 우선 SQL 인젝션이라 불리는 것은 SQL의 의미를 강제로 바꾸는 것이다. 1단계에서는 명령문이 처리되었으며 SQL의 의미가 수정되었습니다. 2단계에서 자리 표시자를 바꾸면 SQL의 의미가 변경되지 않습니다. 다음은 PHP PDO
$stmt = $pdo->prepare("select * from users where username = '?' and password = '?'"); $stmt->execute("123' or 1=1;#", 'test');
예제입니다. 관련 권장 사항: "mysql tutorial"
위 내용은 1분 안에 SQL 주입을 이해하도록 안내합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!