Postgres에서는 준비된 쿼리와 사용자 정의 함수가 SQL 주입을 방지하기위한 메커니즘 과 동일 합니까?
하나의 접근법에서 다른 접근법에 비해 특별한 장점이 있습니까?
답변
따라 다릅니다.
SQL 함수
로 LANGUAGE sql
, 대답은 일반적으로 예 .
전달 된 매개 변수는 값 으로 취급되며 본문에서 안전하지 않은 함수를 호출하지 않고 매개 변수를 전달 하지 않는 한 SQL 주입이 불가능합니다 .
PL / pgSQL 함수
로 LANGUAGE plpgsql
대답은 일반적으로 그렇습니다 .
그러나 PL / pgSQL은 전달 된 매개 변수 (또는 부분)가 쿼리 문자열에 연결되고로 실행되는 동적 SQL을 허용합니다 EXECUTE
. 이것은 사용자 입력을 SQL 코드로 변환하고 SQL 삽입을 가능하게합니다 . 기능 몸체가 올바르게 처리하는지 외부에서 알 수 없습니다. 도구가 제공됩니다.
필요한 곳에만 동적 SQL을 사용하십시오. 매개 변수를 값으로 사용하는 일반 SQL 문은 SQL 함수와 같은 SQL 삽입에 대해 안전합니다.
동적 SQL의 경우 다음을 사용 하여 값을 값 으로 전달하는 것이 좋습니다 .
USING
절. 예 .
원칙적으로 SQL 삽입을 불가능하게합니다.
SQL 문자열에서 값 을 연결하는 경우 다음을 사용하십시오.
문자열을 작은 따옴표로 안전하게 감싸서 구문 오류와 SQL 삽입을 피합니다.
다음 을 사용하여 SQL 문자열에서 식별자 로 처리 될 프로세스 매개 변수 :
format()
형식 지정자와 함께%I
. 예 .quote_ident()
. 예 .- 등록 된 유형 으로 캐스트 –
regclass
테이블 이름 :_tbl::regclass
. 예 .
필요한 경우 문자열을 큰 따옴표로 안전하게 묶어 구문 오류와 SQL 삽입을 피합니다.
관련 :
사용자 입력으로 문자열을 작성하고 실행 하지 마십시오 . 여기에는 사용자가 직접 전달하거나 시스템 카탈로그에서 가져온 식별자가 포함됩니다. 모든 사용자 입력 취급 및 동적 SQL을 구축 할 때 안전하게 인용되어야한다!
이 관련 답변의 성능 영향 에 대한 자세한 내용 :
SQL 주입에 대한 기본 사항 :
동적 SQL을 허용 하는 다른 서버 측 언어 에도 유사한 고려 사항이 적용됩니다 .