>백엔드 개발 >PHP 튜토리얼 >SQL 삽입을 방지하기 위해 준비된 문에서 테이블 이름을 매개 변수화할 수 있습니까?

SQL 삽입을 방지하기 위해 준비된 문에서 테이블 이름을 매개 변수화할 수 있습니까?

DDD
DDD원래의
2024-12-27 08:35:14320검색

Can Table Names Be Parameterized in Prepared Statements to Prevent SQL Injection?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.