Postgres 함수의 SQL 주입 및 준비된 쿼리


답변:


36

따라 다릅니다.

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을 허용 하는 다른 서버 측 언어 에도 유사한 고려 사항이 적용됩니다 .


따라서 요약하면 : 1) 언어 sql 만 사용하면 안전합니다 .2) plpgslq를 사용하지만 실행하지 않으면 안전합니다 .3) plpgsql을 사용하고 실행하지만 식별자와 % s 또는 %는 사용하지 않으면 안전합니다. L은 적절합니다 .4) plpgsql을 사용하고 실행하고 식별자를 사용하지만 % I 또는 quote_ident를 적절하게 사용하는 경우 안전합니다. 옳은?
mickeyf_supports_Monica

@mickeyf : 기본적으로 그렇습니다. 또한 가능할 때마다 USING값을 전달 하는 절을 사용하십시오 EXECUTE. 당신은 할 수 SQL 함수 내에서 PL / pgSQL의 함수를 호출하고 매개 변수를 전달합니다. 따라서 절대적으로 정확하려면 안전하지 않은 기능을 직접 또는 간접적으로 호출하지 않는 한 안전합니다. 모든 기능이 올바르게 수행되면 그럴 수 없습니다.
Erwin Brandstetter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.