MongoDB는 SQL 주입 혼란을 어떻게 피합니까?
나는 믿을만한 O'Reilly 책을 읽고 Mongo가 본질적으로 SQL 인젝션과 같은 결함의 모욕을 피하는 방법에 대한 구절을 발견했습니다.
내 직감에 나는 이것을 이해한다고 생각한다. 삭제되지 않은 변수가 쿼리에 전달 UNION
되면 JOIN
,, 쿼리로 전환 된 주석 등 을 사용하여 문서 지향 쿼리 구조에서 벗어날 수 없습니다 .
MongoDB는 SQL 주입 혼란을 어떻게 피합니까? 이 쿼리 구문의 특성 때문입니까?
MongoDB는 구문 분석을하지 않음으로써 잠재적 인 문제를 방지합니다.
구문 분석되는 형식화 된 텍스트로 사용자 데이터를 인코딩하는 모든 API는 호출자와 호출 수신자가 해당 텍스트를 구문 분석하는 방법에 동의하지 않을 가능성이 있습니다. 이러한 불일치는 데이터가 메타 데이터로 잘못 해석 될 때 보안 문제가 될 수 있습니다. HTML로 된 사용자 생성 콘텐츠를 포함하여 printf 형식 문자열에 대해 이야기하든 SQL을 생성하든 마찬가지입니다.
MongoDB는 구조화 된 텍스트를 구문 분석하여 수행 할 작업을 파악하지 않기 때문에 사용자 입력을 지침으로 잘못 해석 할 가능성이 없으므로 보안 허점이 없습니다.
덧붙여서 파싱이 필요한 API를 피하는 방법은 http://cr.yp.to/qmail/guarantee.html의 항목 5입니다 . 보안 소프트웨어를 작성하는 데 관심이 있다면 다른 6 가지 제안도 살펴볼 가치가 있습니다.
업데이트 (2018) : 내가 제공 한 원래 답변은 내가 아는 한 사실로 유지됩니다. MongoDB로 전송되는 시점부터 다시 전송되는 시점까지 SQL 주입 공격은 없습니다. 내가 알고있는 주입 공격은 MongoDB 외부에서 발생하며 실제로 외부 언어 및 라이브러리가 MongoDB로 전달 될 데이터 구조를 설정하는 방법에 문제가 있습니다. 또한 취약점의 위치는 데이터 구조가되는 과정에서 데이터를 구문 분석하는 방법에 있습니다. 따라서 원래 답변은 주입 공격을 피하는 방법과 그 위험에 처한 요소를 모두 정확하게 설명합니다.
그러나 이러한 정확성은 자체 코드에서 명확하지 않은 결함으로 인한 주입 공격을받는 프로그래머에게 냉정한 위안입니다. 우리 중 일부는 외부 도구와 코드와 해당 외부 도구 사이의 모든 계층을 구별합니다. 그리고 주입 공격을 예상하고 차단하기 위해 우리 측의 경계가 필요하다는 사실은 여전히 남아 있습니다. 모든 도구로. 그리고 이것은 가까운 미래에도 계속 될 것입니다.
MongoDB 문서 를 요약하려면
BSON
클라이언트 프로그램은 MongoDB에서 쿼리를 어셈블 할 때 문자열이 아닌 BSON 객체를 빌드합니다. 따라서 기존의 SQL 주입 공격은 문제가되지 않습니다.
그러나 MongoDB는 인젝션 공격에 영향을받지 않습니다 . 동일한 문서에서 언급했듯이 MongoDB 작업을 통해 임의의 JavaScript 표현식이 서버에서 직접 실행될 수 있으므로 주입 공격이 여전히 가능합니다. 문서는 이에 대해 자세히 설명합니다.
http://docs.mongodb.org/manual/faq/developers/#javascript
PHP를 사용하면 mongoDB가 No-SQL 주입에 취약해질 수 있습니다.
http://www.idontplaydarts.com/2010/07/mongodb-is-vulnerable-to-sql-injection-in-php-at-least/
http://www.php.net/manual/en/mongo.security.php
데이터베이스는 콘텐츠를 구문 분석하지 않을 수 있지만 취약한 코드 영역이 있습니다.
https://www.owasp.org/index.php/Testing_for_NoSQL_injection
SQL 주입으로부터 보호하기 위해 클라이언트는 MongoDB의 언어 API를 사용할 수 있습니다. 이렇게하면 모든 입력이 단순한 값입니다. 명령을 삽입 할 수 없습니다. 자바 예 :
collection.find(Filters.eq("key", "input value"))
단점은 필터를 쉽게 테스트 할 수 없다는 것입니다. Mongo의 셸에 복사하여 테스트 할 수 없습니다. 더 크고 복잡한 필터 / 쿼리에서 특히 문제가됩니다.
그러나!!! 필터의 API를 사용하지 않는 API도 있습니다. 모든 json 필터를 구문 분석 할 수 있습니다. 아래 Java 예제 :
collection.find(BasicDBObject.parse("{key: "input value"}"));
필터를 MongoDB 셸에 직접 복사하여 테스트 할 수 있기 때문에 좋습니다.
그러나!!! (마지막으로 약속하지만) 이것은 NoSql 주입에 취약합니다. 입력 값이 인 Java 예제 {$gt: ""}
.
collection.find(BasicDBObject.parse("{key: {$gt: ""}}"));
이 마지막 예에서는 반환 할 특정 레코드 만 의미했지만 모든 것이 반환됩니다.
필터를 직접 사용할 때 SQL 삽입에 대한 자세한 설명 은 여기를 참조 하십시오 .
마지막 한가지. 원시 필터를 모두 사용하고 여전히 SQL 주입으로부터 보호하는 방법이 있다고 생각합니다. 예를 들어 Java에서는 Jongo의 매개 변수화 된 쿼리를 사용할 수 있습니다 .
참고 URL : https://stackoverflow.com/questions/5021456/how-does-mongodb-avoid-the-sql-injection-mess
'programing' 카테고리의 다른 글
npm 스크립트를 사용하여 js 파일을 어떻게 실행합니까? (0) | 2020.11.28 |
---|---|
순차 Javascript 실행을 강제하는 방법은 무엇입니까? (0) | 2020.11.28 |
원시 유형과 함께 getMethod ()를 사용하는 방법은 무엇입니까? (0) | 2020.11.28 |
bash 스크립트에서 $ {0 % / *}의 의미는 무엇입니까? (0) | 2020.11.28 |
Android의 Google지도 서명 된 API 키 오류 (0) | 2020.11.28 |