준비된 문에서 테이블 이름을 매개 변수화 할 수 있습니까?
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
PARAM 실제로 전송 끝날 것 같은 SELECT * FROM 'mytable'
유효하지 않은 SQL 인 데이터베이스에.
최선의 방법은 계속하는 것입니다.
SELECT * FROM {$mytable}
하지만 당신은 절대적으로 그 경우에 당신이 처음에 확인하는 것이 테이블의 화이트리스트가 있어야 $mytable
사용자 입력에서오고있다.
(최근 답변, 내 사이드 노트를 참조하십시오).
"데이터베이스"를 만들 때도 동일한 규칙이 적용됩니다.
준비된 문을 사용하여 데이터베이스를 바인딩 할 수 없습니다.
즉 :
CREATE DATABASE IF NOT EXISTS ?
작동하지 않을 것이다. 대신 허용 목록을 사용하십시오.
참고 : 이 답변은 종종 질문을 닫는 데 사용 되었기 때문에 (커뮤니티 위키로) 일부 사람들이 테이블 및 / 또는 열이 아닌 데이터베이스 를 바인딩하려고 할 때 이와 유사한 질문을 게시했기 때문에 추가했습니다 .
'development' 카테고리의 다른 글
Copy-Item은 디렉토리와 내용을 UNC 경로로 복사합니다. (0) | 2020.12.05 |
---|---|
최대 고 루틴 수 (0) | 2020.12.05 |
제네릭 유형 매개 변수에서`.class` 속성을 얻으려면 어떻게해야합니까? (0) | 2020.12.05 |
CLion으로 C 프로젝트를 만드는 방법 (0) | 2020.12.05 |
Python 3.6의 변수 주석은 무엇입니까? (0) | 2020.12.05 |