in-memory backend: Adds support to select variables using regex

This commit is contained in:
Felipe Zimmerle 2016-07-08 15:36:34 -03:00
parent 4daf9d8ab0
commit de8245d8f9
No known key found for this signature in database
GPG Key ID: E6DFB08CE8B11277
2 changed files with 48 additions and 13 deletions

View File

@ -25,6 +25,7 @@
#include "modsecurity/collection/variable.h"
#include "src/utils.h"
#include "src/utils/regex.h"
namespace modsecurity {
namespace collection {
@ -108,7 +109,37 @@ void InMemoryPerProcess::resolveMultiMatches(const std::string& var,
void InMemoryPerProcess::resolveRegularExpression(const std::string& var,
std::vector<const Variable *> *l) {
/* Not ready */
if (var.find(":") == std::string::npos) {
return;
}
if (var.size() < var.find(":") + 3) {
return;
}
std::string col = std::string(var, 0, var.find(":"));
std::string name = std::string(var, var.find(":") + 2, var.size() - var.find(":") - 3);
size_t keySize = col.size();
Utils::Regex r = Utils::Regex(name);
for (const auto& x : *this) {
if (x.first.size() <= keySize + 1) {
continue;
}
if (x.first.at(keySize) != ':') {
continue;
}
if (std::string(x.first, 0, keySize) != col) {
continue;
}
std::string content = std::string(x.first, keySize + 1,
x.first.size() - keySize - 1);
int ret = Utils::regex_search(content, r);
if (ret <= 0) {
continue;
}
l->insert(l->begin(), new Variable(x.first, x.second));
}
}

View File

@ -35,15 +35,18 @@ Variable::Variable(std::string name)
m_collectionName(""),
m_isExclusion(false),
m_isCount(false) {
if (m_name.at(0) == '\\') {
m_type = RegularExpression;
} else if (m_name.find(":") != std::string::npos) {
if (m_name.find(":") != std::string::npos) {
std::string col = toupper(std::string(m_name, 0, m_name.find(":")));
std::string name = std::string(m_name, m_name.find(":") + 1, m_name.size());
if (col == "TX" || col == "IP" || col == "GLOBAL"
|| col == "RESOURCE" || col == "SESSION") {
m_collectionName = col;
}
m_type = SingleMatch;
if ((name.at(0) == '\\') || (name.at(0) == '/')) {
m_type = RegularExpression;
} else {
m_type = SingleMatch;
}
} else {
m_type = MultipleMatches;
}
@ -78,15 +81,18 @@ Variable::Variable(std::string name, VariableKind kind)
m_kind(kind),
m_isExclusion(false),
m_isCount(false) {
if (m_name.at(0) == '\\') {
m_type = RegularExpression;
} else if (m_name.find(":") != std::string::npos) {
if (m_name.find(":") != std::string::npos) {
std::string col = toupper(std::string(m_name, 0, m_name.find(":")));
std::string name = std::string(m_name, m_name.find(":") + 1, m_name.size());
if (col == "TX" || col == "IP" || col == "GLOBAL"
|| col == "RESOURCE" || col == "SESSION") {
m_collectionName = col;
}
m_type = SingleMatch;
if ((name.at(0) == '\\') || (name.at(0) == '/')) {
m_type = RegularExpression;
} else {
m_type = SingleMatch;
}
} else {
m_type = MultipleMatches;
}
@ -127,8 +133,7 @@ void Variable::evaluateInternal(Transaction *transaction,
if (m_kind == CollectionVarible && m_type == MultipleMatches) {
transaction->m_collections.resolveMultiMatches(m_name,
m_collectionName, l);
} else if (m_kind == CollectionVarible
&& m_type == RegularExpression) {
} else if (m_type == RegularExpression) {
transaction->m_collections.resolveRegularExpression(m_name,
m_collectionName, l);
} else {
@ -138,8 +143,7 @@ void Variable::evaluateInternal(Transaction *transaction,
} else {
if (m_kind == CollectionVarible && m_type == MultipleMatches) {
transaction->m_collections.resolveMultiMatches(m_name, l);
} else if (m_kind == CollectionVarible
&& m_type == RegularExpression) {
} else if (m_type == RegularExpression) {
transaction->m_collections.resolveRegularExpression(m_name, l);
} else {
transaction->m_collections.resolveSingleMatch(m_name, l);