Postgres 함수의 SQL 주입 및 준비된 쿼리 주입을 방지하기위한 메커니즘 과 동일 합니까?

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 문자열에서 식별자 로 처리 될 프로세스 매개 변수 :

필요한 경우 문자열을 큰 따옴표로 안전하게 묶어 구문 오류와 SQL 삽입을 피합니다.

관련 :

사용자 입력으로 문자열을 작성하고 실행 하지 마십시오 . 여기에는 사용자가 직접 전달하거나 시스템 카탈로그에서 가져온 식별자가 포함됩니다. 모든 사용자 입력 취급 및 동적 SQL을 구축 할 때 안전하게 인용되어야한다!

이 관련 답변의 성능 영향 에 대한 자세한 내용 :

SQL 주입에 대한 기본 사항 :

동적 SQL을 허용 하는 다른 서버 측 언어 에도 유사한 고려 사항이 적용됩니다 .