mirror of
https://github.com/owasp-modsecurity/ModSecurity.git
synced 2025-08-14 05:45:59 +03:00
Adds experimental operator cache
This commit is contained in:
parent
c204f1f003
commit
326696976f
11
src/rule.cc
11
src/rule.cc
@ -257,9 +257,13 @@ bool Rule::evaluate(Assay *assay) {
|
||||
return evaluateActions(assay);
|
||||
}
|
||||
|
||||
#ifndef NO_LOGS
|
||||
std::string eparam = MacroExpansion::expand(this->op->param, assay);
|
||||
std::string cache_key = eparam + this->op->op + Variable::to_s(variables) + std::to_string(rule_id);
|
||||
if (RuleInstantCache::getInstance().count(cache_key) > 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifndef NO_LOGS
|
||||
if (this->op->param != eparam) {
|
||||
eparam = "\"" + eparam + "\" Was: \"" + this->op->param + "\"";
|
||||
} else {
|
||||
@ -490,6 +494,11 @@ bool Rule::evaluate(Assay *assay) {
|
||||
}
|
||||
//delete e;
|
||||
}
|
||||
|
||||
if (ret == 0) {
|
||||
RuleInstantCache::getInstance().cache(cache_key);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
18
src/rule.h
18
src/rule.h
@ -29,6 +29,24 @@
|
||||
|
||||
namespace ModSecurity {
|
||||
|
||||
class RuleInstantCache : public std::unordered_map<std::string, int> {
|
||||
public:
|
||||
static RuleInstantCache& getInstance() {
|
||||
static RuleInstantCache instance;
|
||||
return instance;
|
||||
}
|
||||
|
||||
void cache(const std::string& value) {
|
||||
emplace(value, 1);
|
||||
if (size() > 1500) {
|
||||
erase(begin());
|
||||
}
|
||||
}
|
||||
private:
|
||||
RuleInstantCache() {};
|
||||
};
|
||||
|
||||
|
||||
class Rule {
|
||||
public:
|
||||
Rule(operators::Operator *_op,
|
||||
|
Loading…
x
Reference in New Issue
Block a user