준비된 스테이트먼트에서 테이블 이름을 파라미터화할 수 있습니까?
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
'source' 카테고리의 다른 글
| SQLSTATE[HY000] [1045] 'user'@'localhost'에 대한 액세스가 거부되었습니다(암호 사용: YES). (0) | 2022.11.01 |
|---|---|
| 사용자 "@localhost"에 대한 액세스가 거부되었습니다(비밀번호: no 사용). (0) | 2022.11.01 |
| Panda의 데이터 프레임은 각 그룹의 첫 번째 행을 가져옵니다. (0) | 2022.11.01 |
| 데이터 클래스는 무엇이며 일반 클래스와 어떻게 다릅니까? (0) | 2022.11.01 |
| MySQL에서 AUTO_INCREMENT를 리셋하는 방법 (0) | 2022.11.01 |