현재 위치: > 최신 기사 목록> SQL 주입은 처리되지 않으며 결과는 비정상적입니다

SQL 주입은 처리되지 않으며 결과는 비정상적입니다

M66 2025-05-28

MySQL 데이터베이스 작업에 PHP를 사용할 때 개발자는 종종 MySQLI 확장에서 관련 기능을 사용하여 쿼리 및 프로세스 결과 세트를 실행합니다. 예를 들어, mysqli_query ()는 mysqli_result 객체와 함께 사용하여 쿼리 결과를 쉽게 얻을 수 있습니다. 그러나 SQL 문을 구성 할 때 입력 매개 변수가 올바르게 처리되지 않으면 SQL 주입 문제를 일으킬 수 있으므로 비정상적인 쿼리 결과, 데이터 유출 및 시스템 분해로 이어질 수 있습니다.

1. 문제 시나리오 예제

사용자 정보를 쿼리하는 페이지가 있다고 가정하면 코드는 다음과 같습니다.

 <?php
$conn = new mysqli("localhost", "root", "password", "mydb");

$username = $_GET['username']; // 사용자 입력에서
$sql = "SELECT * FROM users WHERE username = '$username'";

$result = $conn->query($sql);

if ($result && $result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        echo "사용자: " . $row["username"] . ",우편: " . $row["email"] . "<br>";
    }
} else {
    echo "未找到사용자";
}
$conn->close();
?>

사용자가 다음 URL을 입력하는 경우 :

 https://m66.net/user.php?username=admin' OR '1'='1

그러면 SQL 문은 다음과 같습니다.

 SELECT * FROM users WHERE username = 'admin' OR '1'='1'

이는 인증 조건을 우회하고 모든 사용자의 레코드를 반환합니다.

2. 비정상적인 쿼리 결과의 원인 분석

MySQLI_RESULT 객체를 사용하여 결과 세트를 처리 할 때 반환 된 데이터는 SQL 문의 실행 결과에 따라 다릅니다. 명세서에 불법 조건이 주입되어 예상치 못한 데이터가 포함 된 결과 세트가 발생하면 프로그램 논리가 편향됩니다.

  • 잘못 판단 조건 : 위의 예에서와 같이, 논리는 $ result-> num_rows> 0 이 사실이라고 판단하지만 실제로 반환 된 데이터가 전부 일 수 있습니다.

  • 데이터 유출 : 공격자는 다른 사용자의 개인 정보 보호 정보를 읽기 위해 조건을 구성 할 수 있습니다.

  • 혼란스러운 후속 작업 : 계속 허가 판단을 내리면 결과를 기반으로 레코드 및 기타 작업을 수정하면 결과가 더욱 심각해집니다.

3. 솔루션

1. 준비된 진술을 사용하십시오

SQL 주입은 repary ()bind_param ()을 사용하여 완전히 방지 할 수 있습니다.

 <?php
$conn = new mysqli("localhost", "root", "password", "mydb");

$username = $_GET['username'];
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ?");
$stmt->bind_param("s", $username);
$stmt->execute();

$result = $stmt->get_result();
if ($result && $result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        echo "사용자: " . $row["username"] . ",우편: " . $row["email"] . "<br>";
    }
} else {
    echo "未找到사용자";
}

$stmt->close();
$conn->close();
?>

전처리 명령문을 사용한 후 매개 변수가 자동으로 빠져 나와 유형을 확인하여 소스에서 주입을 방지합니다.

2. 필터 사용자 입력

전처리를 대체 할 수는 없지만 보안 보증의 보충으로 모든 사용자 입력에는 필요한 검증이 적용되어야합니다. 예를 들어:

 $username = filter_input(INPUT_GET, 'username', FILTER_SANITIZE_STRING);

또는 불법 문자와 키워드를 거부하기위한 사용자 정의 필터링 로직.

3. 데이터베이스 액세스 계층의 통합 캡슐화

다른 모듈의 개발자의 반복적 인 실수를 피하기 위해 데이터베이스 액세스 로직을 통합 클래스 또는 함수로 캡슐화하고 항상 내부적으로 전처리를 사용하고 SQL 문의 스 플라이 싱을 금지하는 것이 좋습니다.

4. 요약

MySQLI_RESULT 자체는 SQL 주입 문제를 일으키지 않지만 Escaped SQL 문에 사용되면 쿼리 단계에서 심각한 숨겨진 위험이 발생합니다. 사용자 입력이 관련된 한 쿼리 작업이 아무런 무해하더라도 전처리 문을 사용해야합니다.

기억하십시오 : ** 사용자 이름 일지라도 입력을 신뢰하지 마십시오. ** M66.net과 같은 온라인 서비스에서 이러한 기본 보안 조치가 무시되면 데이터는 적어도 비정상적이며 시스템 충돌 및 데이터 누출이 최악입니다.

모든 PHP 개발자가 합리적인 보호 조치를 취하고 코드 수준에서 SQL 주입을 제거하는 것은 엄청난 책임입니다.