TL; DR 예.
Ruby 드라이버의 내부 특성을 알지 못합니다. 그러나 나는 그것이 사용할 수있는 세 가지 전략이 있다고 가정합니다. 이론적으로 최상위 SQL 주입 공격 (아래에서 자세히 설명)은 이론상 가능하지만 준비된 문과 마찬가지로 저급 SQL 주입 공격에 취약 할 수 있습니다.
- 쿼리는
- 매개 변수
- 이 계획은
을 실행 쿼리를 계획하는 데 사용되는 구문 분석 트리로 구문 분석됩니다 :
이것을 이해하려면, PostgreSQL의 쿼리를 실행하는 방법을 이해할 필요가
- 데이터는 반환을 위해 제공됩니다.
준비된 문장에서는 계획이 저장되지만 그로 인해 안전하지 않습니다. 최상위 레벨 공격에 대해 안전하게 만드는 이유는 매개 변수가 구문 분석 할 쿼리와 별도로 전송된다는 점입니다.
첫 번째 전략은 서버 측 준비문이 될 수 있습니다. 이 경우 계획은 저장되고 잠재적으로 재사용되어 바람직하지 않은 (또는 바람직한) 성능 영향을 미칠 수 있습니다.
두 번째는 PostgreSQL 프로토콜이 준비된 문을 사용하지 않아도 쿼리와 매개 변수가 별도로 전송 될 수 있다는 것입니다. 이는 동일한 보안 이점을 갖지만 계획 재사용을 허용하지 않습니다. 코드를 살펴보면이 메소드가 작동하는 기본 방법처럼 보입니다.
세 번째는 클라이언트 측 이스케이프 처리를 할 수 있다는 것입니다. Perl의 DBD :: Pg가이 문제로 다시 돌아갈 수는 있지만 거의 불가능하다는 것을 알고 있습니다. 나는 fallback을 보지 못했지만 아마도 내가 놓친 것이있을 것입니다.
그렇다면 일반적으로 저는 그렇습니다. 최악의 방법을 사용하더라도 비교할 수있는 이점을 제공합니다.
참고 계속해서 최상위 공격에 대해 이야기하고 있습니다. 예를 들어 트리거 같은 어딘가에서 함수를 호출하면 SQL 인젝션을 가질 수 있습니다. 이것은 동적 SQL이 관련되어 있지만 일반적으로 문제가되지 않는 경우 발생합니다. 계획 단계가 위의 실행 단계의 하위 부분으로 발생하고 매개 변수가 항상 채워지기 때문에 위의 방법 중 아무 것도이를 방지 할 수 없습니다.
이 때문에 응용 프로그램의 모든 수준에서 좋은 코딩 방법이 중대한.
매우 명확한 답변! 고마워. – Thibauld