이 함수를 SQL 주입으로부터 보호하는 방법은 무엇입니까?
P粉573943755
P粉573943755 2023-11-07 22:03:43
0
2
747

rreee

P粉573943755
P粉573943755

모든 응답(2)
P粉434996845

내가 아는 한, 적어도 Oracle이나 Sql Server에서는 매개변수화된 쿼리를 사용하여 DDL 문을 실행하거나 테이블 이름을 지정할 수 없습니다. 미친 TruncateTable 함수가 있어야 하고 SQL 주입을 피할 수 있어야 한다면 입력이 안전하게 잘릴 수 있는 테이블인지 확인하는 저장 프로시저를 만드는 것입니다.

으아악
P粉738346380

SQL 주입을 방지하기 위한 가장 일반적인 조언은 SQL 쿼리 매개변수를 사용하는 것입니다(이 스레드의 여러 사람들이 이를 제안했습니다).

이 경우에는 잘못된 답변입니다. DDL 문의 테이블 이름에는 SQL 쿼리 매개변수를 사용할 수 없습니다.

SQL 쿼리 매개변수는 SQL 표현식의 리터럴 값 대신에만 사용할 수 있습니다. 이는 모든 SQL 구현의 표준입니다.

테이블 이름이 있는 경우 SQL 삽입을 방지하기 위한 권장 사항은 알려진 테이블 이름 목록과 비교하여 입력 문자열의 유효성을 검사하는 것입니다.

INFORMATION_SCHEMA:

에서 유효한 테이블 이름 목록을 얻을 수 있습니다. 으아악

이제 입력 변수를 이 쿼리에 SQL 매개변수로 전달할 수 있습니다. 쿼리가 행을 반환하지 않으면 입력이 유효하지 않으며 테이블로 사용할 수 없다는 의미입니다. 쿼리가 행을 반환하면 일치하므로 더욱 안심하고 사용할 수 있습니다.

@John Buchanan이 suggested에 따라 응용 프로그램에서 잘라낼 수 있는 것으로 정의한 특정 테이블 목록에 대해 테이블 ​​이름을 확인할 수도 있습니다.

tableName이 RDBMS에 테이블 이름으로 존재하는지 확인한 후에도 테이블 이름에 공백이나 특수 문자를 사용하는 경우를 대비해 테이블 ​​이름을 구분하는 것이 좋습니다. Microsoft SQL Server에서 기본 식별자 구분 기호는 대괄호입니다.

으아악

이제 tableName가 실제 테이블과 일치하고 실제로 테이블 이름에 대괄호를 사용하는 경우에만 SQL 주입의 위험이 있습니다!

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿