Skip to content

Commit 1d3c4c6

Browse files
author
Felipe Zimmerle
committed
Treating ARGS_NAMES as an array instead of scalar
Both value and key are the same.
1 parent 81879cd commit 1d3c4c6

File tree

10 files changed

+3419
-3347
lines changed

10 files changed

+3419
-3347
lines changed

headers/modsecurity/transaction.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,6 @@ class TransactionAnchoredVariables {
172172
m_variableOffset(0)
173173
{ }
174174

175-
AnchoredVariable m_variableArgsNames;
176175
AnchoredVariable m_variableArgGetNames;
177176
AnchoredVariable m_variableArgPostNames;
178177
AnchoredVariable m_variableRequestHeadersNames;
@@ -227,6 +226,7 @@ class TransactionAnchoredVariables {
227226
AnchoredVariable m_variableUrlEncodedError;
228227
AnchoredVariable m_variableUserID;
229228

229+
AnchoredSetVariable m_variableArgsNames;
230230
AnchoredSetVariable m_variableArgs;
231231
AnchoredSetVariable m_variableArgsGet;
232232
AnchoredSetVariable m_variableArgsPost;

src/macro_expansion.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,7 @@ std::string MacroExpansion::expand(const std::string& input,
7373
collection = variable.find(":");
7474
}
7575
if (collection == std::string::npos) {
76-
if (compareStrNoCase(variable, "ARGS_NAMES")) {
77-
variableValue = transaction->m_variableArgsNames.resolveFirst();
78-
}
79-
else if (compareStrNoCase(variable, "ARGS_GET_NAMES")) {
76+
if (compareStrNoCase(variable, "ARGS_GET_NAMES")) {
8077
variableValue = transaction->m_variableArgGetNames.resolveFirst();
8178
}
8279
else if (compareStrNoCase(variable, "ARGS_POST_NAMES")) {
@@ -245,6 +242,9 @@ std::string MacroExpansion::expand(const std::string& input,
245242
if (compareStrNoCase(col, "ARGS")) {
246243
variableValue = transaction->m_variableArgs.resolveFirst(var);
247244
}
245+
if (compareStrNoCase(variable, "ARGS_NAMES")) {
246+
variableValue = transaction->m_variableArgsNames.resolveFirst(var);
247+
}
248248
else if (compareStrNoCase(col, "RULE")) {
249249
variableValue = transaction->m_variableRule.resolveFirst(var);
250250
}

src/parser/seclang-parser.cc

Lines changed: 599 additions & 577 deletions
Large diffs are not rendered by default.

src/parser/seclang-parser.yy

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1514,6 +1514,18 @@ var:
15141514
{
15151515
VARIABLE_CONTAINER($$, new Variables::Args_NoDictElement());
15161516
}
1517+
| VARIABLE_ARGS_NAMES DICT_ELEMENT
1518+
{
1519+
VARIABLE_CONTAINER($$, new Variables::ArgsNames_DictElement($2));
1520+
}
1521+
| VARIABLE_ARGS_NAMES DICT_ELEMENT_REGEXP
1522+
{
1523+
VARIABLE_CONTAINER($$, new Variables::ArgsNames_DictElementRegexp($2));
1524+
}
1525+
| VARIABLE_ARGS_NAMES
1526+
{
1527+
VARIABLE_CONTAINER($$, new Variables::ArgsNames_NoDictElement());
1528+
}
15171529
| VARIABLE_ARGS_POST DICT_ELEMENT
15181530
{
15191531
VARIABLE_CONTAINER($$, new Variables::ArgsPost_DictElement($2));
@@ -1794,13 +1806,6 @@ var:
17941806
{
17951807
VARIABLE_CONTAINER($$, new Variables::Session_NoDictElement());
17961808
}
1797-
1798-
1799-
1800-
| VARIABLE_ARGS_NAMES
1801-
{
1802-
VARIABLE_CONTAINER($$, new Variables::ArgsNames());
1803-
}
18041809
| VARIABLE_ARGS_GET_NAMES
18051810
{
18061811
VARIABLE_CONTAINER($$, new Variables::ArgsGetNames());

src/parser/seclang-scanner.cc

Lines changed: 2757 additions & 2747 deletions
Large diffs are not rendered by default.

src/parser/seclang-scanner.ll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -755,6 +755,8 @@ EQUALS_MINUS (?i:=\-)
755755
{VARIABLE_USER_ID} { return p::make_VARIABLE_USER_ID(*driver.loc.back()); }
756756
{VARIABLE_ARGS} { return p::make_VARIABLE_ARGS(*driver.loc.back()); }
757757
{VARIABLE_ARGS}[:] { BEGIN(EXPECTING_VAR_PARAMETER); return p::make_VARIABLE_ARGS(*driver.loc.back()); }
758+
{VARIABLE_ARGS_NAMES} { return p::make_VARIABLE_ARGS(*driver.loc.back()); }
759+
{VARIABLE_ARGS_NAMES}[:] { BEGIN(EXPECTING_VAR_PARAMETER); return p::make_VARIABLE_ARGS(*driver.loc.back()); }
758760
{VARIABLE_ARGS_GET} { return p::make_VARIABLE_ARGS_GET(*driver.loc.back()); }
759761
{VARIABLE_ARGS_GET}[:] { BEGIN(EXPECTING_VAR_PARAMETER); return p::make_VARIABLE_ARGS_GET(*driver.loc.back()); }
760762
{VARIABLE_ARGS_POST} { return p::make_VARIABLE_ARGS_POST(*driver.loc.back()); }

src/transaction.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ bool Transaction::addArgument(const std::string& orig, const std::string& key,
309309
m_variableArgsPost.set(key, value, offset);
310310
m_variableArgPostNames.append(key, offset - key.size() - 1, true);
311311
}
312-
m_variableArgsNames.append(key, offset - key.size() - 1, true);
312+
m_variableArgsNames.set(key, key, offset - key.size() - 1);
313313

314314
m_ARGScombinedSizeDouble = m_ARGScombinedSizeDouble + \
315315
key.length() + value.length();

src/variables/args_names.h

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,51 @@ namespace modsecurity {
2929
class Transaction;
3030
namespace Variables {
3131

32-
class ArgsNames : public Variable {
32+
class ArgsNames_DictElement : public Variable {
3333
public:
34-
ArgsNames()
34+
explicit ArgsNames_DictElement(std::string dictElement)
35+
: Variable("ARGS_NAMES" + std::string(":") + std::string(dictElement)),
36+
m_dictElement(dictElement) { }
37+
38+
void evaluate(Transaction *transaction,
39+
Rule *rule,
40+
std::vector<const collection::Variable *> *l) override {
41+
transaction->m_variableArgsNames.resolve(m_dictElement, l);
42+
}
43+
44+
std::string m_dictElement;
45+
};
46+
47+
48+
class ArgsNames_NoDictElement : public Variable {
49+
public:
50+
ArgsNames_NoDictElement()
3551
: Variable("ARGS_NAMES") { }
3652

3753
void evaluate(Transaction *transaction,
3854
Rule *rule,
39-
std::vector<const collection::Variable *> *l) {
40-
transaction->m_variableArgsNames.evaluate(l);
55+
std::vector<const collection::Variable *> *l) override {
56+
transaction->m_variableArgsNames.resolve(l);
4157
}
4258
};
4359

60+
61+
class ArgsNames_DictElementRegexp : public Variable {
62+
public:
63+
explicit ArgsNames_DictElementRegexp(std::string dictElement)
64+
: Variable("ARGS_NAMES:regex(" + dictElement + ")"),
65+
m_r(dictElement) {
66+
}
67+
68+
void evaluate(Transaction *transaction,
69+
Rule *rule,
70+
std::vector<const collection::Variable *> *l) override {
71+
transaction->m_variableArgsNames.resolveRegularExpression(&m_r, l);
72+
}
73+
74+
Utils::Regex m_r;
75+
};
76+
4477
} // namespace Variables
4578
} // namespace modsecurity
4679

test/test-cases/regression/offset-variable.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -314,11 +314,11 @@
314314
]
315315
},
316316
"expected":{
317-
"error_log":"o0,17v17,6v31,6v45,6v149,6v163,6v177,6t:trim"
317+
"error_log":"o0,3v17,6t:trimo0,3v149,6t:trimo0,3v31,6t:trimo0,3v163,6t:trimo0,3v45,6t:trimo0,3v177,6t:trim"
318318
},
319319
"rules":[
320320
"SecRequestBodyAccess On",
321-
"SecRule ARGS_NAMES \"@rx param1 param2 par\" \"id:1,phase:2,pass,t:trim,msg:'ops'\""
321+
"SecRule ARGS_NAMES \"@rx par\" \"id:1,phase:2,pass,t:trim,msg:'ops'\""
322322
]
323323
},
324324
{

test/test-cases/regression/variable-ARGS_NAMES.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
]
3232
},
3333
"expected":{
34-
"debug_log":"Target value: \"key key\""
34+
"debug_log":"Target value: \"key\""
3535
},
3636
"rules":[
3737
"SecRuleEngine On",
@@ -70,7 +70,7 @@
7070
]
7171
},
7272
"expected":{
73-
"debug_log":"Target value: \"key key\""
73+
"debug_log":"Target value: \"key\""
7474
},
7575
"rules":[
7676
"SecRuleEngine On",
@@ -114,7 +114,7 @@
114114
]
115115
},
116116
"expected":{
117-
"debug_log":"Target value: \"param1 param2\""
117+
"debug_log":"Target value: \"param1\""
118118
},
119119
"rules":[
120120
"SecRuleEngine On",
@@ -158,7 +158,7 @@
158158
]
159159
},
160160
"expected":{
161-
"debug_log":"Target value: \"param1 param2\""
161+
"debug_log":"Target value: \"param1\" "
162162
},
163163
"rules":[
164164
"SecRuleEngine On",

0 commit comments

Comments
 (0)