데이터베이스 작업에 PHP의 MySQLI 확장을 사용할 때 개발자는 종종 성능을 향상시키고 보안을 향상시키기 위해 진술을 전제로 제공하도록 설계된 MySQLI_STMT 클래스에서 제공하는 다양한 방법에 노출됩니다. PHP 8.1에 소개 된 MySQLI_STMT :: ATT_GET 함수를 통해 개발자는 전처리 진술의 일부 기본 속성에 액세스 할 수 있습니다. 그러나 새로운 기능의 도입은 필연적으로 보안에 관심을 끌었습니다. 이 기사는 MySQLI_STMT :: ATTR_GET에 보안 위험이 있는지에 대해 논의하고 사용중인 잠재적 위험을 요약합니다.
mysqli_stmt :: attr_get은 mysqli_stmt 객체의 속성을 얻는 데 사용되는 함수입니다. 프로토 타입은 다음과 같습니다.
public mysqli_stmt::attr_get(int $attribute): int|false
개발자는 mysqli_stmt_attr_update_max_length 등과 같은 일부 내부 명령문 속성을 읽을 수 있습니다. 특정 시나리오에서는 메모리 사전 메모리와 같은 프로그램 논리를 최적화하는 데 도움이 될 수 있습니다.
샘플 코드는 다음과 같습니다.
$mysqli = new mysqli("localhost", "user", "password", "database");
$stmt = $mysqli->prepare("SELECT * FROM users WHERE status = ?");
$stmt->bind_param("s", $status);
$stmt->attr_set(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH, true);
$stmt->execute();
$stmt->store_result();
$maxLenAttr = $stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
echo "속성 값: " . ($maxLenAttr ? "할 수 있게 하다" : "未할 수 있게 하다");
함수 자체의 관점에서 attr_get은 상태를 수정할 수없고 데이터베이스 작업을 직접 수행하지 않는 읽기 전용 함수입니다. 따라서 기존의 SQL 주입 관점에서 보안 위협을 직접 제기하지는 않습니다.
그러나 간접적 인 위험은 여전히 주목할 가치가 있습니다.
개발자가 적절한 필터링 또는 처리없이 Attr_get 의 반환 결과를 사용자에게 노출 시키면 시스템 구현 세부 정보에 대한 정보가 실수로 유출 될 수 있습니다. 예를 들어:
$url = "https://m66.net/debug.php?stmt_attr=" . $stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
이 시나리오에서 공격자는이를 사용하여 현재 데이터베이스 작업에서 특정 옵션이 활성화되어 있는지 추측하여보다 복잡한 공격 (예 : 사이드 채널 공격)을 지원할 수 있습니다.
일부 개발자는 attr_get을 실행 상태 또는 매개 변수 확인을 확인하기위한 기초로 Oxuse를 오용하고 명령문이 실제로 실행 된 후 반환 값 점검을 무시할 수 있습니다. 예를 들어:
if ($stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH)) {
// 진술이 안전하거나 성공적으로 실행된다는 것을 오해했습니다
}
이 관행은 실제 실행 실패 또는 예외를 가릴 수있어 취약성이 무시 될 수 있습니다.
attr_get은 제한된 속성을 지원하기 때문에 다른 데이터베이스 드라이버 또는 버전에서 지원하는 속성도 다를 수 있습니다. 일부 환경에서는 일부 속성이 유효하지 않을 수 있습니다. 개발자가 호환성을 처리하지 못하면 프로그램 논리 오류가 발생하고 보안 또는 안정성 문제가 발생합니다.
mysqli_stmt :: attr_get을 보다 안전하게 사용하려면 개발자는 다음과 같은 점에주의를 기울여야합니다.
리턴 값을 프론트 엔드 사용자에게 노출시키지 마십시오. 디버깅에 필요한 경우 페이지 나 API를 통해 직접 출력 대신 로그 시스템을 통해 로그인하십시오.
결과를 유일한 안전 기준으로 사용하지 마십시오. 보안 검증은 귀환 값 및 예외 처리 메커니즘을 기반으로해야합니다.
버전 탐지와 함께 사용됩니다. 사용하기 전에 현재 환경이 런타임 오류 또는 논리적 편차를 피하기 위해 관련 속성을 지원하는지 여부를 결정하십시오.
오류 처리 메커니즘과 함께 사용됩니다. mysqli_report () 또는 예외 캡처 메커니즘과 결합하여 진술이 실행되지 않을 때 올바르게 인식되고 응답 할 수 있는지 확인하십시오.
mysqli_stmt :: attr_get 자체에는 명백한 보안 취약점이 없지만 사용 시나리오는 비교적 좁고 쉽게 오용됩니다. 주요 위험은 SQL 주입 또는 원격 실행과 같은 전통적인 보안 문제가 아니라 정보 유출 및 오류의 종속성 논리에 있습니다. 이 기능을 사용할 때 개발자는 코드의 가독성과 신중함을 유지하고 최종 프로그램 흐름에 대한 결과가 결정적인 영향을 피해야합니다. 안전하고 안정적인 개발을 보장하는 데 사용 및 경계에 대한 올바른 이해가 중요합니다.