왜 준비된 PDO 문에 테이블 이름을 전달할 수 없나요?
으아아아SQL 쿼리에 테이블 이름을 삽입하는 다른 안전한 방법이 있나요? 안전하다는 것은 하고 싶지 않다는 뜻이에요
으아아아P粉1387117942023-10-18 11:56:39
바인딩 테이블(또는 열) 이름이 작동하지 않는 이유를 이해하려면 준비된 문의 자리 표시자가 어떻게 작동하는지 이해해야 합니다. 자리 표시자는 단순히 (올바르게 이스케이프된) 문자열과 결과 SQL로 대체되는 것이 아닙니다. 대조적으로, "준비" 문이 필요한 DBMS는 어떤 테이블과 인덱스가 사용될 것인지를 포함하여 쿼리를 실행하는 방법에 대한 완전한 쿼리 계획을 제시하며, 이는 자리 표시자를 어떻게 채우더라도 동일합니다. < /p>
SELECT name FROM my_table WHERE id = :value
的计划将与您替换 :value
的内容相同,但表面上相似的 SELECT name FROM :table WHERE id = :value
실제로 어떤 테이블을 선택하고 있는지 DBMS에서 알 수 없으므로 예약할 수 없습니다.
PDO와 같은 추상화 라이브러리가 해결할 수 있거나 해결해야 하는 문제도 아닙니다. 준비된 문의 두 가지 주요 목적을 무너뜨리기 때문입니다. 1) 데이터베이스가 쿼리 실행 방법을 미리 결정하고 동일한 계획을 사용할 수 있도록 허용합니다. 2) ) 쿼리 로직을 변수 입력과 분리하여 보안 문제를 방지합니다.
P粉9787424052023-10-18 09:40:36
PDO에서는 테이블 이름과 열 이름을 매개변수로 바꿀 수 없습니다.
이 경우 데이터를 수동으로 필터링하고 정리하면 됩니다. 이를 수행하는 한 가지 방법은 쿼리를 동적으로 실행할 함수에 약식 인수를 전달한 다음 switch() 문을 사용하여 테이블 이름에 대한 유효한 값 또는 열 이름의 화이트리스트를 만드는 것입니다. 이렇게 하면 사용자 입력이 쿼리에 직접 입력되지 않습니다. 예:
으아악기본 케이스를 유지하지 않거나 오류 메시지를 반환하는 기본 케이스를 사용함으로써 사용하려는 값만 사용되도록 보장합니다.