내가 원하는 것을 이해했다면, 실제로 SQL 주입을 전혀 원하지 않을 것입니다. 사실, 앱이 디자인에 따라 임의의 SQL을 실행할 수 있도록 허용하고 있습니다.
을 SQL이 실행되도록 제한하는 것이 좋습니다.
이것은 실패 할 운명입니다. 최소한 PostgreSQL에서 SELECT
은 권한이있는 사용자가 호출 할 때 일반 사용자가 실행하지 못하도록하는 모든 종류의 기능을 실행할 수 있습니다. 또한 사용자는 반드시 알 필요가없는 정보로 가득 찬 시스템 카탈로그에 액세스 할 수 있습니다.
단일 SQL 문자열에 여러 명령을 포함 할 수 없도록하는 구문 분석기를 성공적으로 작성한 경우에도 명령 유형 으로 필터링하면이 작동하지 않습니다. 희망만큼이나 단순하지 않습니다. 당신은 standard_conforming_strings
리터럴을 위해 켜기와 끄기, $$
따옴표, 식별자 따옴표, --
, /* */
등을 처리해야합니다. 은이됩니다. 필터에 구멍이 있거나 완벽하게 합법적 인 명령을 금합니다.
사용자로부터 명령을 실행할 때 권한이 낮은 데이터베이스 역할을 사용하는 것이 조금 더 안전한 방법입니다. 이 역할은 명시 적으로 무엇을 읽을 권리가 있어야합니다. GRANT
INSERT
, UPDATE
또는 DELETE
권한이없고 테이블이나 다른 개체 소유권이 없어야하며 물론 수퍼 유저가 아니어야합니다. 사용자가 원하는 SQL을 보내거나 필터링을 시도 할 수는 있지만 데이터베이스의 액세스 권한을 사용하여 장난 치는 것을 막을 수 있습니다. SET TRANSACTION READ ONLY
도 가능하지만 이러한 설정은 대부분 권장 사항이며 엄격한 제한 사항이 아니라는 것을 알고 있어야합니다.
필자가 아는 한 레일스는 권한없는 연결을 쉽게하거나 업그레이드보다 덜 특권있는 연결로 작업하도록 만들지 않습니다. 레일스는 모든 것을 하나의 데이터베이스 사용자, 일반적으로 모든 객체를 소유하는 매우 특권있는 사용자로 생각하여 언제든지 마이그레이션을 수행 할 수 있기를 바랍니다. Rails/ActiveRecord 철학의 일부입니다. 데이터베이스는 멍청한 행 저장소가 아닙니다.
더 유연한 프레임 워크 인 경우에도 다른 사용자 권한으로 연결하는 것이 여전히 고통 스럽습니다. SET ROLE
또는 SET SESSION AUTHORIZATION
이 작동하지만 양쪽 모두 권한있는 연결을 얻으려면 재설정 할 수 있습니다. 현재는 PostgreSQL에서 권한을 삭제할 생각이 없습니다. 사용자가 RESET ROLE
또는 RESET SESSION AUTHORIZATION
을 몰래 사용하여 임의의 SQL에서 편안하게 사용할 수있는 방법이 너무 많습니다. 따라서 실제로 다른 자격 증명으로 새 연결을 만들어야합니다.
그게 내가하는 일이다. 다른 자격 증명으로 새 연결을 만들고 SQL을 매우 제한된 사용자 계정으로 실행하십시오. REVOKE
과 같이이 계정에서 pg_proc
및 pg_class
을 볼 수 있으며 시스템 카탈로그의 표시량을 제한하고 실제로 필요한 테이블에 대한 최소 액세스 권한 만 부여 할 수 있습니다. (REVOKE CREATE ON SCHEMA public FROM public
을 기억하고 GRANT
은 테이블을 만들려는 사용자에게만 돌아갑니다).
그걸 갖고 싶어서 이상하게 보입니다. 가능한 세분화 된 명령 집합을 가질 수 있습니까? 또한 SQL 인젝션은 아무 것도 넣지 않는 방식으로, 사용자 입력입니다. 사용자 입력을 받아들이 기위한 정책을 생각해내는 몇 가지 규칙을 제공해야합니다. – xlembouras
수 없습니다. 사용자로부터 SQL을 받아들입니다. 문을 열고 "들어 와서 원하는 SQL을 실행하십시오"라고 말하면 SQL "삽입"을 방지하는 것은 의미가 없습니다. 어떤 종류의 SQL 명령 *이 실행될 수 있는지 제한하기 위해 * 사용자 입력을 필터링하려고합니까? –