MongoDB는 어떻게 SQL 주입 혼란을 피할 수 있습니까?
믿을 수 있는 O'Reilly 책을 읽다가 Mongo가 SQL 주입과 같은 결함의 수렁을 어떻게 피하는지 우연히 알게 되었습니다.
네, 네, 네.이 쿼리에 전달되면 수 UNION
,JOIN
comment 등 「 」
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/ # 스크립트
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
SQL 주입으로부터 보호하기 위해 클라이언트는 MongoDB의 언어 API를 사용할 수 있습니다.이렇게 하면 모든 입력이 단순한 값입니다. 명령을 주입할 수 없습니다.Java의 예:
collection.find(Filters.eq("key", "input value"))
단점은 필터를 쉽게 테스트할 수 없다는 것입니다.몽고의 껍데기에 복사해서 테스트할 수는 없습니다.특히 더 크고 복잡한 필터/쿼리에 문제가 있습니다.
그러나!!! 필터의 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의 파라미터화된 쿼리를 사용할 수 있습니다.
데이터베이스는 내용을 구문 분석하지 않을 수 있지만 코드에는 취약한 다른 영역이 있습니다.
https://www.owasp.org/index.php/Testing_for_NoSQL_injection
언급URL : https://stackoverflow.com/questions/5021456/how-does-mongodb-avoid-the-sql-injection-mess
'programing' 카테고리의 다른 글
Xcode: 프로젝트 빌딩의 "file xxx.png is missing from working copy" 문제 (0) | 2023.04.11 |
---|---|
Angular JS를 사용하여 다른 모듈 구성에 상수 주입 (0) | 2023.04.06 |
각도로 변수 전달JS 컨트롤러, 베스트 프랙티스? (0) | 2023.04.06 |
각도에서 _servicename_의 밑줄은 무엇을 의미합니까?JS 테스트? (0) | 2023.04.06 |
스프링 부트 프로젝트(JAR 또는 WAR 양쪽에 도입) 1개 (0) | 2023.04.06 |