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