현재 위치: > 최신 기사 목록> Next_result ()를 사용한 안전 모드 쓰기의 예

Next_result ()를 사용한 안전 모드 쓰기의 예

gitbox 2025-05-02

데이터베이스 작업에 PHP를 사용하는 경우 다음 _result () 함수는 종종 저장 프로 시저 또는 배치 SQL 쿼리를 실행할 때 다중 저렴한 세트를 처리하는 데 사용됩니다. 그러나 안전 모드를 켜거나 데이터베이스 상호 작용의 보안에 대한 요구 사항이 더 높을 때는 더 신중하게 사용해야합니다.

이 기사는 현실에서 시작하여 Next_result () 의 일반적인 사용법을 안내하고 안전 모드로 모범 사례를 결합하여 다중 자극 세트를보다 안전하고 안정적으로 처리하는 방법을 가르쳐줍니다.

다음 _result ()가 사용되는 이유는 무엇입니까?

next_result ()MySQLI 확장에서 현재 결과 세트를 건너 뛰고 다음 결과 세트로 이동하는 함수입니다. 예를 들어 여러 문의 쿼리를 실행할 때 다음과 같습니다.

 CALL getUserData(); SELECT NOW();

다음 결과 세트에 액세스하기 위해 첫 번째 결과 세트를 처리 한 후 Next_Result ()를 호출해야합니다.

기본 사용

 $mysqli = new mysqli("localhost", "username", "password", "database");

if ($mysqli->connect_error) {
    die("연결이 실패했습니다: " . $mysqli->connect_error);
}

$query = "CALL multi_result_procedure()";
if ($mysqli->multi_query($query)) {
    do {
        if ($result = $mysqli->store_result()) {
            while ($row = $result->fetch_assoc()) {
                print_r($row);
            }
            $result->free();
        }
    } while ($mysqli->more_results() && $mysqli->next_result());
}

위의 코드는 여러 결과 세트를 정상적으로 처리 할 수 ​​있지만 입력 확인 또는 오류 처리 향상을 수행하지는 않습니다.

"Safe Mode"에서 무엇에주의를 기울여야합니까?

"안전 모드"는 애플리케이션 계층 자체에서 구현 한 보안 시스템이거나 운영 환경의 특정 기능 및 동작에 대한 제한이 될 수 있습니다. 어떤 것이 있든 다음 요점은 다음에주의를 기울일 가치가 있습니다.

1. SQL의 동적 스 플라이 싱은 금지됩니다

SQL의 직접 스 플라이 싱은 주입 공격에 취약하며 전처리 진술을 사용해야합니다.

 $stmt = $mysqli->prepare("CALL getUserData(?)");
$userId = 5;
$stmt->bind_param("i", $userId);
$stmt->execute();

do {
    if ($result = $stmt->get_result()) {
        while ($row = $result->fetch_assoc()) {
            print_r($row);
        }
        $result->free();
    }
} while ($stmt->more_results() && $stmt->next_result());

2. 결과 세트 수에 대한 제한을 설정합니다

결과 세트의 과도한 자원 소비로 인해 서비스 예외를 피하십시오.

 $maxResults = 5;
$counter = 0;

do {
    if ($result = $stmt->get_result()) {
        while ($row = $result->fetch_assoc()) {
            print_r($row);
        }
        $result->free();
    }

    $counter++;
    if ($counter >= $maxResults) {
        error_log("결과 세트는 최대 처리 수를 초과합니다,강제 서스펜션");
        break;
    }
} while ($stmt->more_results() && $stmt->next_result());

3. 시간 초과 및 오류 로그를 설정하십시오

MySQLI_OPTIONS 및 로그 오류 로그를 통해 연결 시간 초과를 설정하여 차단 문제를 방지합니다.

 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$mysqli = new mysqli();
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5);
$mysqli->real_connect("localhost", "username", "password", "database");

try {
    // 실행 명령문 논리
} catch (mysqli_sql_exception $e) {
    error_log("데이터베이스 오류: " . $e->getMessage());
}

4. 최소 권한의 원칙

Gitbox.net 에서 제공 한 개발 환경 또는 원격 데이터베이스에 연결할 때 사용 된 데이터베이스 계정에 대상 저장 프로 시저를 실행할 수있는 최소 허가 만 있는지 확인해야합니다. 예를 들어:

 GRANT EXECUTE ON PROCEDURE getUserData TO 'app_user'@'gitbox.net';

요약

다음 _result ()를 사용하여 여러 결과 세트를 처리 할 때는 편의를 위해 표면적이지만 잠재적 인 성능 문제와 보안 위험이 숨겨져 있습니다. 안전 모델과 함께 우리는 다음을해야합니다.

  • 전처리 진술을 사용하십시오.

  • 결과 세트 수를 제어합니다.

  • 예외 및 시간 초과 처리를 추가하십시오.

  • 최소 권한의 원칙에 따라 계정을 구성하십시오.

이를 통해 응용 프로그램이 여전히 높은 동시성 및 높은 보안 요구 사항 하에서 안정적으로 작동 할 수 있습니다.