source

준비된 스테이트먼트에서 테이블 이름을 파라미터화할 수 있습니까?

bestscript 2022. 11. 1. 21:41

준비된 스테이트먼트에서 테이블 이름을 파라미터화할 수 있습니까?

mysqli_stmt_bind_param 함수를 여러 번 사용했습니다.그러나 SQL 주입으로부터 보호하려는 변수를 분리하면 오류가 발생합니다.

다음은 코드 샘플입니다.

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( $statment, 'sssisss', $Partner, $Merchant, $ips, $score, $category, $overall, $protocol );
    $statement->execute();
}

어떻게 해서든 이 장치를.$new_table.다른 물음표 문과 연결하거나 다른 바인드 파라미터 문을 만들거나 SQL 주입으로부터 보호하기 위해 기존 문 위에 추가합니다.

이렇게 또는 이런 형태로:

function insertRow( $db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol )
{    
    $statement = $mysqli->prepare("INSERT INTO (?) VALUES (?,?,?,?,?,?,?);");
    mysqli_stmt_bind_param( $statment, 'ssssisss', $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol );
    $statement->execute();
}

당신의 질문에 대한 짧은 대답은 "아니오"입니다.

가장 엄밀한 의미에서 데이터베이스 수준에서 준비된 문은 SQL 문의 "값" 비트에만 매개 변수를 바인딩할 수 있습니다.

이에 대한 한 가지 생각은 "문의 실행 시 의미를 변경하지 않고 대체할 수 있는 것"입니다.테이블 이름은 SQL 문 자체의 유효성(즉, 유효한 열 이름)을 결정하므로 이러한 런타임 값 중 하나가 아닙니다. 실행 시 테이블 이름을 변경하면 SQL 문이 유효한지 여부가 변경될 수 있습니다.

조금 더 높은 레벨에서는 준비된 스테이트먼트를 실제로 데이터베이스로 송신하는 것이 아니라 준비된 스테이트먼트 파라미터 치환을 에뮬레이트하는 데이터베이스 인터페이스(PDO 등)에서도 플레이스 홀더를 사용할 수 있습니다(플레이스 홀더는 이러한 시스템에서 데이터베이스로 전송되기 전에 대체되기 때문에).테이블 플레이스 홀더의 문자열은 데이터베이스로 전송되는SQL 내에서 둘러싸여 있기 때문에SELECT * FROM ?와 함께mytable파라미터가 실제로 송신할 것이기 때문에SELECT * FROM 'mytable'데이터베이스로 이동합니다.이것은 유효하지 않은 SQL입니다.

계속하는 것이 최선책입니다.

SELECT * FROM {$mytable}

하지만 먼저 대조하는 화이트리스트 테이블이 있어야 합니다.$mytable사용자 입력에서 생성됩니다.

"데이터베이스"를 작성하려고 할 때도 동일한 규칙이 적용됩니다.

준비된 문을 사용하여 데이터베이스를 바인딩할 수 없습니다.

예:

CREATE DATABASE IF NOT EXISTS ?

동작하지 않습니다.대신 세이프리스트를 사용하세요.

언급URL : https://stackoverflow.com/questions/11312737/can-i-parameterize-the-table-name-in-a-prepared-statement