这对我来说还是一个新手,但是当我在NodeJS应用程序中生成一个处理.nessus结果文件的数字数组时,我遇到了一个有趣的行为问题。首先,我要完成的一些细节。我的应用程序从上传的“结果”文件生成一个数组[1234,1223,1222],然后用于查询mongodb实例以确定这些条目当前是否在数据库中。如果这些条目当前不在mongodb实例中,则它会重定向到用户可以在添加之前编辑它们的页面。如果没有新条目,则会转到页面以生成条目报告。
上传文件时,会存储新条目。在.nessus文件中,有时会有多个带有条目的主机。这改变了json结构,函数需要以不同的方式迭代。以下函数是这些条目的存储方式。 这很重要,因为这是怪异行为的起源(我认为)
function parsePluginNumbers(json){
var pluginNumbers = []
//Let's check the number of hosts
var hostLength = json['NessusClientData_v2']['Report'].ReportHost.length
if (hostLength != undefined) {
for (var i = 0; i < hostLength; i++) { //Since there is more than 1, need to iterate over each host to find the findings.
var item_length = json['NessusClientData_v2']['Report'].ReportHost[i].ReportItem.length
for (var t = 0; t < item_length; t++) { //Iterate through each finding on each host
if (json['NessusClientData_v2']['Report'].ReportHost[i].ReportItem[t].risk_factor != 'None') {
var newEntry = json['NessusClientData_v2']['Report'].ReportHost[i].ReportItem[t].pluginID
if (pluginNumbers.indexOf(newEntry) == -1) {
pluginNumbers.push(newEntry)
}
else {
continue
}
} else {
continue
}
}
}
} else {
var item_length = json['NessusClientData_v2']['Report']['ReportHost'].ReportItem.length
for (var t = 0; t < item_length; t++) { //Iterate over findings
if (json['NessusClientData_v2']['Report']['ReportHost'].ReportItem[t].risk_factor != 'None') {
var newEntry = json['NessusClientData_v2']['Report']['ReportHost'].ReportItem[t].pluginID
if (pluginNumbers.indexOf(newEntry) == -1) {
pluginNumbers.push(newEntry)
}
else {
continue
}
} else {
continue
}
}
}
return pluginNumbers
}
存储这些插件后。调用另一个函数来查看这些结果是否在mongodbinstance中。在这个函数中,这些插件位于数组“pluginsTotal”中。
function queryForNewResultsInANessusFile(pluginsTotal, collectionname, filename){ //function to call mongodb query and send results to parseNewFindings and parseOldFindings.
var db = req.db;
var collection = db.get(collectionname);
collection.find({ 'PluginNumber' : { $in: pluginsTotal }}, 'FindingTitle FindingDescription Remediation Mitigation SeeAlso PluginFamily PluginNumber CVE Risk -_id', function(error, result){
var newPluginArray = parseOutFindingNumbersInMongoDB(result, pluginsTotal);
//IF statements go here with specific redirects as needed to check if there are new values not in the repo
}
在此collection.find调用期间,有一个函数parseOutFindingNumbersInMongoDB被调用,以确定.nessus结果文件中是否有不在repo中的插件。它比较了collection.find和pluginsTotal(从第一个函数生成)的结果,并返回了不在repo中的新插件的数组。功能详情如下:
function parseOutFindingNumbersInMongoDB(repoResults, reportPlugins) {
for (var i = 0; i < repoResults.length; i++){
var index = reportPlugins.indexOf(repoResults[i].PluginNumber);
if (index != -1) {
reportPlugins.splice(index, 1);
}
else {
continue
}
}
return reportPlugins
}
现在我的问题---当我上传一个包含多个主机的.nessus文件时,即使有新条目,parseOutFindingNumberInMongoDB也会返回空。是什么赋予了?这是我在parsePluginNumbers函数中解析数字的方式,还是因为它在collection.find同步函数中被调用(这似乎不太可能,就好像有一个主机,它返回我想要的新插件值) ?任何想法/想法/评论都会非常感激,因为我无法弄清楚出了什么问题。在传递给函数之前,我检查了数组中的数据类型,它们都匹配。
答案 0 :(得分:0)
它总是返回一个空数组,因为数组中的每个元素都与要拼接的条件匹配。
首先使用此过滤器PluginNumber
pluginTotal
数组中{ $in: pluginsTotal }
的元素
collection.find({ 'PluginNumber' : { $in: pluginsTotal }}, 'FindingTitle FindingDescription Remediation Mitigation SeeAlso PluginFamily PluginNumber CVE Risk -_id', function(error, result){
var newPluginArray = parseOutFindingNumbersInMongoDB(result, pluginsTotal);
}
然后删除PluginNumber
pluginTotal
的所有元素
var index = reportPlugins.indexOf(repoResults[i].PluginNumber);
if (index != -1) {
reportPlugins.splice(index, 1);
}
所以结果总是一个空数组。