2014-12-12 4 views
1

В настоящее время я работаю над проектом, в котором я использую MongoDB для хранения моих данных. Обе коллекции имеют следующий формат:Regex like search in mongo db nestex query

CVE

{ 
    "Modified" : "2014-09-27T06:55:04.867-04:00", 
    "Published" : "2014-09-27T06:55:04.867-04:00", 
    "_id" : ObjectId("542923711bb35a10e3053986"), 
    "cvss" : "9.3", 
    "cwe" : "Unknown", 
    "id" : "CVE-2014-3062", 
    "last-modified" : "2014-09-29T09:00:35.803-04:00", 
    "references" : [ 
    "http://xforce.iss.net/xforce/xfdb/93540", 
    "http://www-01.ibm.com/support/docview.wss?uid=swg21683609" 
    ], 
    "summary" : "Unspecified vulnerability in IBM Security QRadar SIEM 7.1 MR2 and 7.2 MR2 allows remote attackers to execute arbitrary code via unknown vectors.", 
    "vulnerable_configuration" : [ 
    "cpe:/a:ibm:qradar_security_information_and_event_manager:7.1.0", 
    "cpe:/a:ibm:qradar_security_information_and_event_manager:7.2.0" 
    ] 
} 

mgmt_whitelist

{ 
"_id" : ObjectId("548855641bb35a2dc5675244"), 
"id" : "cpe:/a:ibm:qradar_security_information_and_event_manager:7.2.0" 
} 

Я хотел бы, чтобы найти все элементы в ССО с уязвимой конфигурации в mgmt_whitelist, которые я могу легко достичь, используя:

db.cves.find(
    {'vulnerable_configuration': 
     {'$in': db.mgmt_whitelist.distinct('id')} 
    } 
).sort({Modified: -1}).limit(10) 

Однако белый список также содержит записи, как

{ 
    "_id" : ObjectId("54885ff41bb35a2f57a7c567"), 
    "id" : "cpe:/a:7-zip:7-zip" 
} 

, который является форматом СР без версии. Я хотел бы иметь возможность выполнять поиск в виде регулярных выражений, так что эти белые элементы также можно найти в поиске.

Я попытался

db.cves.find(
    {'vulnerable_configuration': 
     {'$in': 
      {'$regex':db.mgmt_whitelist.distinct('id') 
     } 
    } 
).sort({Modified: -1}).limit(10) 

, но это не работает ... Что я должен делать вместо этого?

Спасибо заранее,

Pidgey

+0

Для каждого отдельного идентификатора 'whitelist' вам нужно создать объект' regex', в зависимости от того, как вам нужно сопоставлять. Затем вы можете выполнить его как: '({weak_configuration: {$ in: [RegexOne, RegexTwo, ...]}})' – BatScream

ответ

0

Я нашел проблему. Чтобы добавить регулярное выражение, которое содержит: и /, мне нужно было использовать новый RegExp(). Таким образом, в конце концов, я использовать что-то вроде этого:

db.cves.find(
    {'vulnerable_configuration': 
    {'$in': 
     [new RegExp("cpe:/a:gnu:bash"),new RegExp("cpe:/a:adobe:acrobat_reader")] 
    } 
    } 
).sort({Modified: -1}).limit(10) 

Это как стыду я не могу сделать все, что в одном заявлении (пожалуйста, поправьте меня, если я ошибаюсь), но я могу решить, что с моим кодом , Спасибо за ваши советы, BatScream

+0

'new RegExp (« cpe:/a: adobe: acrobat_reader »)' - это плохой код. Вы ** должны ** [regex-quote] (http://stackoverflow.com/questions/2593637/how-to-escape-regular-expression-in-javascript) строки, которые вы передаете конструктору регулярных выражений. – Tomalak

0
RegExp.quote = function (str) { 
    return (str + '').replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&"); 
}; 

function startsWithExp(string) { 
    return new RegExp("^" + RegExp.quote(string)); 
} 
// ----------------------------------------------------------------- 

db.cves.find({ 
    vulnerable_configuration: { 
     $in: db.mgmt_whitelist.distinct('id').map(startsWithExp) 
    } 
}).sort({Modified: -1}).limit(10); 

В более расширенном сценарии вы можете вернуть смешанный список строк и регулярных выражений, для повышения производительности (при необходимости - измерение, если усложнение имеет какие-либо реальное преимущества):

function cpeStartsWithOrMatches(cve_id) { 
    var cpeWithVersion = /:\d+(?:\.\d+)+$/; 

    return cpeWithVersion.test(string) ? string : startsWithExp(string); 
} 
// ----------------------------------------------------------------- 

db.cves.find({ 
    vulnerable_configuration: { 
     $in: db.mgmt_whitelist.distinct('id').map(cpeStartsWithOrMatches) 
    } 
}).sort({Modified: -1}).limit(10); 

В качестве альтернативы вы можете построить одно большое выражение:

function startsWithAnyExp(strings) { 
    return new RegExp("^(?:" + strings.map(RegExp.quote).join("|") + ")"); 
} 

db.cves.find({ 
    vulnerable_configuration: { 
     $regex: startsWithAnyExp(db.mgmt_whitelist.distinct('id')) 
    } 
}).sort({Modified: -1}).limit(10); 
+0

Спасибо за фрагменты кода, но я использую Python для моего кода ... Кажется, я не могу заставить его работать, до сих пор ... Любые намеки указать мне в правильном направлении? :) – pidgey

+0

Ничего, я понял! Спасибо за подсказку в правильном направлении! – pidgey

+0

@pidgey Что? Вы не используете код Python в своем собственном ответе и не используете код Python в своем собственном вопросе.o_O – Tomalak