development

준비된 문에서 테이블 이름을 매개 변수화 할 수 있습니까?

big-blog 2020. 12. 5. 10:08
반응형

준비된 문에서 테이블 이름을 매개 변수화 할 수 있습니까?


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 ?mytablePARAM 실제로 전송 끝날 것 같은 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

반응형