Prepared 문에서 테이블 이름 매개변수화: 가능합니까?
Prepared 문 내에서 테이블 이름을 매개변수화하려고 하면 일반적으로 SQL 주입 취약점이 발생합니다. mysqli_stmt_bind_param 함수는 매개변수를 값에 바인딩하는 것을 허용하지만 매개변수화된 테이블 이름은 지원하지 않습니다.
예를 들어, 다음 코드 조각은 테이블 이름을 매개변수화하려는 시도를 보여줍니다.
function insertRow($db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol) { $statement = $mysqli->prepare("INSERT INTO ? VALUES (?,?,?,?,?,?,?);"); mysqli_stmt_bind_param($statement, 'ssssisss', $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol)); $statement->execute(); }
그러나 , 이 접근 방식은 올바르지 않으며 실행 시 잘못된 쿼리가 발생합니다. 준비된 문은 매개 변수를 특정 값에 바인딩하도록 설계되었으며 테이블 이름은 매개 변수화할 수 있는 값으로 간주되지 않습니다.
대신 보호를 위해 허용되는 값의 화이트리스트와 함께 정적 테이블 이름을 사용하는 것이 좋습니다. SQL 주입. 예:
function insertRow($db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol) { if (!in_array($new_table, $allowed_tables)) { throw new Exception("Invalid table name"); } $statement = $mysqli->prepare("INSERT INTO $new_table VALUES (?,?,?,?,?,?,?);"); mysqli_stmt_bind_param($statement, 'sssisss', $Partner, $Merchant, $ips, $score, $category, $overall, $protocol); $statement->execute(); }
이 접근 방식을 사용하면 유효한 테이블 이름만 사용되어 동적 테이블 이름 변경과 관련된 SQL 주입 위험을 완화할 수 있습니다.
위 내용은 SQL 삽입을 방지하기 위해 준비된 문에서 테이블 이름을 매개 변수화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!