P粉4349968452023-11-08 20:39:55
내가 아는 한, 적어도 Oracle이나 Sql Server에서는 매개변수화된 쿼리를 사용하여 DDL 문을 실행하거나 테이블 이름을 지정할 수 없습니다. 미친 TruncateTable 함수가 있어야 하고 SQL 주입을 피할 수 있어야 한다면 입력이 안전하게 잘릴 수 있는 테이블인지 확인하는 저장 프로시저를 만드는 것입니다.
으아악P粉7383463802023-11-08 09:41:58
SQL 주입을 방지하기 위한 가장 일반적인 조언은 SQL 쿼리 매개변수를 사용하는 것입니다(이 스레드의 여러 사람들이 이를 제안했습니다).
이 경우에는 잘못된 답변입니다. DDL 문의 테이블 이름에는 SQL 쿼리 매개변수를 사용할 수 없습니다.
SQL 쿼리 매개변수는 SQL 표현식의 리터럴 값 대신에만 사용할 수 있습니다. 이는 모든 SQL 구현의 표준입니다.
테이블 이름이 있는 경우 SQL 삽입을 방지하기 위한 권장 사항은 알려진 테이블 이름 목록과 비교하여 입력 문자열의 유효성을 검사하는 것입니다.
INFORMATION_SCHEMA
:
이제 입력 변수를 이 쿼리에 SQL 매개변수로 전달할 수 있습니다. 쿼리가 행을 반환하지 않으면 입력이 유효하지 않으며 테이블로 사용할 수 없다는 의미입니다. 쿼리가 행을 반환하면 일치하므로 더욱 안심하고 사용할 수 있습니다.
@John Buchanan이 suggested에 따라 응용 프로그램에서 잘라낼 수 있는 것으로 정의한 특정 테이블 목록에 대해 테이블 이름을 확인할 수도 있습니다.
tableName
이 RDBMS에 테이블 이름으로 존재하는지 확인한 후에도 테이블 이름에 공백이나 특수 문자를 사용하는 경우를 대비해 테이블 이름을 구분하는 것이 좋습니다. Microsoft SQL Server에서 기본 식별자 구분 기호는 대괄호입니다.
이제 tableName
가 실제 테이블과 일치하고 실제로 테이블 이름에 대괄호를 사용하는 경우에만 SQL 주입의 위험이 있습니다!