> 데이터 베이스 > MySQL 튜토리얼 > 준비된 문이 테이블 이름을 안전하게 매개변수화할 수 있습니까?

준비된 문이 테이블 이름을 안전하게 매개변수화할 수 있습니까?

DDD
풀어 주다: 2025-01-23 18:16:14
원래의
700명이 탐색했습니다.

Can Prepared Statements Securely Parameterize Table Names?

준비된 문 및 테이블 이름 보안: 중요한 검토

많은 개발자가 SQL 주입 취약점을 방지하기 위해 mysqli_stmt_bind_param에 의존하고 있습니다. 그러나 이 접근 방식은 테이블 이름을 매개변수화하려고 할 때 문제를 야기합니다.

다음 예를 고려해보세요.

<code class="language-php">function insertRow($db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol) {
    $statement = $mysqli->prepare("INSERT INTO " . $new_table . " VALUES (?,?,?,?,?,?,?);");
    mysqli_stmt_bind_param($statement, 'sssisss', $Partner, $Merchant, $ips, $score, $category, $overall, $protocol);
    $statement->execute();
}</code>
로그인 후 복사

이는 변수를 바인딩하여 SQL 주입을 완화하려고 시도하지만 테이블 이름 $new_table은 취약한 상태로 남습니다. 준비된 문 내에서 $new_table에 대한 자리 표시자를 사용할 수 있나요?

아니요. 데이터베이스 준비 문은 테이블 또는 열 식별자가 아닌 에 대한 매개변수 바인딩만 지원합니다. 이는 테이블 이름이 SQL 문의 구조와 유효성에 필수적이기 때문입니다. 동적으로 변경하면 잘못된 SQL이 발생할 수 있습니다.

보다 유연한 자리 표시자 사용을 제공하는 PDO와 같은 데이터베이스 인터페이스를 사용하더라도 테이블 이름을 직접 대체하려고 하면 잘못된 SQL이 발생합니다.

<code class="language-sql">SELECT * FROM ?</code>
로그인 후 복사

올바른 접근 방식은 문자열 보간을 사용하는 것입니다.

<code class="language-php">SELECT * FROM {$mytable}</code>
로그인 후 복사

그러나 이를 위해서는 엄격한 테이블 허용 목록이라는 중요한 보안 조치가 필요합니다. 악의적인 입력으로 인해 데이터베이스가 손상되는 것을 방지하려면 항상 사전 정의된 허용 테이블 이름 목록과 비교하여 $mytable의 유효성을 검사하세요. 테이블 이름 보안을 위해 준비된 명령문에만 의존하지 마십시오.

위 내용은 준비된 문이 테이블 이름을 안전하게 매개변수화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿