집 >데이터 베이스 >MySQL 튜토리얼 >준비된 문이 테이블 이름을 안전하게 매개변수화할 수 있습니까?
준비된 문 및 테이블 이름 보안: 중요한 검토
많은 개발자가 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!