쿼리를 거의 완전히 구성할 수 있는 경우 SQL 주입 제한
웹 응용 프로그램에서 SQL 쿼리의 예약된 덤프를 수행해야 합니다.처음에는 테이블 전체였지만(테이블 이름만 설정 가능), 설정 가능한 WHERE 절이 열의 서브셋과 함께 추가되었습니다.
필요한 구성 가능한 옵션은 다음과 같습니다.
- 열
- 테이블명
- where 절
이쯤 되면 그냥 전체 쿼리일 수도 있지?!
는 SQLi에 의해 어느 될 수 것을 있습니다.java.sql.PreparedStatement
단, 컴파일 시 컬럼과 데이터 타입을 알고 있어야 합니다.
구성 가능한 항목은 최종 사용자에게 노출되지 않습니다.이 파일들은 다음 중 하나의 속성 파일에 저장됩니다.WEB-INF/classes
그래서 여기서 방어하는 사용자는 생각만큼 좋지 않은 sysadmins입니다.
제가 너무 조심스러웠나요?
에는 할 수 없다, 할 수 있다, 할 수 있다java.sql.PreparedStatement
WHERE 이 WHERE 인 경우되지 않도록 .Robert'); DROP TABLE students;--
준비된 진술로는 이 문제를 해결할 수 없습니다.준비된 문을 사용하면 테이블 이름, 열 이름 또는 전체 where 구가 아닌 파라미터만 쿼리에 안전하게 추가할 수 있습니다.
특히 후자는 아무런 제약이 없으면 주입을 막는 것이 사실상 불가능하다.열 및 테이블 이름 매개 변수는 데이터베이스 구조에 따라 정적으로 정의되거나 동적으로 정의된 유효한 값 목록과 비교할 수 있습니다.where 파라미터에 대한 기본적인 regex 체크를 수행할 수 있지만 이는 명백한 SQL 주입에만 도움이 됩니다.SELECT FROM WHERE 형식으로 제공하는 유연성으로 다음과 같은 쿼리를 받을 수 있습니다.
SELECT mycolumn FROM mytable WHERE id = 1 AND 'username' in (SELECT username FROM users)
JOOQ와 같은 기능을 통해 사용자가 쿼리할 수 있는 대상을 제한할 수 있는 안전한 동적 쿼리 구축을 제공할 수 있습니다.어떤 식으로든 사용자를 제한하는 것이 중요합니다.그렇게 하지 않으면 SQL 주입뿐만 아니라 성능 문제도 걱정해야 합니다.예를 들어 시각적(드래그 앤 드롭) 쿼리 작성기를 제공합니다.
"다 따라 달라"
사용자가 where 구를 자유 텍스트로 입력할 수 있는 응용 프로그램이 있는 경우 SQL Injection 공격을 구성할 수 있습니다.또한 대규모 데카르트 결합을 선택하여 서버를 정지시킬 수도 있습니다.
시각적 쿼리 작성기를 만들 수 있습니다. 스키마 메타데이터를 사용하여 테이블 목록을 표시하고 테이블을 선택한 후 열과 각 열에 대해 유효한 비교를 수행할 수 있습니다.그런 다음 쿼리를 매개 변수화된 쿼리로 구성하고 비교 값으로 사용자 입력을 제한할 수 있습니다. 비교 값은 다시 매개 변수로 사용할 수 있습니다.
많은 작업이 필요하지만, 모든 규모의 프로덕션 시스템에서 사용자가 이러한 종류의 쿼리를 실행하도록 하는 것은 일반적으로 그다지 유용하지 않습니다.
사용자가 임의 쿼리를 실행하도록 허용하는 것은 안전하지 않습니다.이것은 에퀴팩스에서 볼 수 있는 그런 종류의 것이다.허락하고 싶지 않잖아
준비된 문은 SQL 식을 안전하게 만드는 데 도움이 되지 않습니다.준비된 문장에서 매개 변수를 사용하면 값을 안전하게 만들 수 있습니다.파라미터는 숫자, 따옴표로 묶인 문자열 또는 따옴표로 묶인 날짜와 같이 일반적으로 상수 값을 넣는 장소에서만 사용할 수 있습니다.
가장 쉬운 해결책은 요청 시 임의 쿼리 또는 식을 허용하지 않는 것입니다.
대신 사용자가 검토를 위해 사용자 지정 쿼리를 제출할 수 있도록 허용합니다.
쿼리는 사용자에 의해 검토되며, 사용자는 저장된 쿼리를 사용자(또는 다른 사용자)에 의해 실행되도록 승인할 수 있습니다.자동검증기를 개발할 수 있다고 생각하신다면, IMHO는 자격을 갖춘 데이터베이스 관리자가 검토하는 것보다 훨씬 더 많은 작업이 필요할 것입니다.
이후 사용자는 저장된 쿼리를 필요에 따라 실행할 수 있지만 해당 ID만 사용할 수 있습니다.
여기 또 다른 아이디어가 있습니다. 커스텀 쿼리를 실행하려는 사용자는 데이터베이스 복제본을 가져오거나 자신의 컴퓨터에서 호스트하기 위해 신청할 수 있습니다.표시 권한이 부여된 데이터 서브셋의 덤프를 가져옵니다.그리고 데이터를 폐기하는 쿼리를 실행하거나 컴퓨터를 녹이는 것은 그들의 일입니다.
언급URL : https://stackoverflow.com/questions/46771452/limiting-sql-injection-when-query-is-almost-entirely-configurable
'programing' 카테고리의 다른 글
URL 쿼리 문자열 매개 변수 가져오기 (0) | 2022.10.05 |
---|---|
새로고침으로 인해 빈 상태가 반환되는 이유는 무엇입니까? (0) | 2022.10.05 |
Spring Integration을 사용하는 시기와낙타? (0) | 2022.10.05 |
Mysql 변환 테이블, 조회가 변경되지 않음 (0) | 2022.10.05 |
연산자로서의 'AND' vs '&' (0) | 2022.10.05 |