Skip to content

Commit be37489

Browse files
committed
Allow regular expressions in ctl:ruleRemoveTargetByX variable names II.
1 parent 788c36d commit be37489

File tree

1 file changed

+30
-1
lines changed

1 file changed

+30
-1
lines changed

apache2/re.c

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ static int fetch_target_exception(msre_rule *rule, modsec_rec *msr, msre_var *va
6262
char *c = NULL, *name = NULL, *value = NULL;
6363
char *variable = NULL, *myvar = NULL;
6464
char *myvalue = NULL, *myname = NULL;
65+
msc_regex_t *regex;
66+
char *errptr;
67+
int erroffset;
6568
int match = 0;
6669

6770
if(msr == NULL)
@@ -115,7 +118,33 @@ static int fetch_target_exception(msre_rule *rule, modsec_rec *msr, msre_var *va
115118
(strncasecmp(myname, name,strlen(myname)) == 0)) {
116119

117120
if(value != NULL && myvalue != NULL) {
118-
if((strlen(myvalue) == strlen(value)) &&
121+
if(strlen(value) > 2 && value[0] == '/' && value[strlen(value) - 1] == '/') {
122+
value[strlen(value) - 1] = '\0';
123+
#ifdef WITH_PCRE2
124+
regex = msc_pregcomp(msr->mp, value + 1,
125+
PCRE2_DOTALL | PCRE2_CASELESS | PCRE2_DOLLAR_ENDONLY, (const char **)&errptr, &erroffset);
126+
#else
127+
regex = msc_pregcomp(msr->mp, value + 1,
128+
PCRE_DOTALL | PCRE_CASELESS | PCRE_DOLLAR_ENDONLY, (const char **)&errptr, &erroffset);
129+
#endif
130+
if (regex == NULL) {
131+
if (msr->txcfg->debuglog_level >= 9) {
132+
msr_log(msr, 9, "fetch_target_exception: Regexp /%s/ failed to compile at pos %d: %s.",
133+
value + 1, erroffset, errptr);
134+
}
135+
} else {
136+
#ifdef WITH_PCRE2
137+
if (!(msc_regexec(regex, myvalue, strlen(myvalue), &errptr) == PCRE2_ERROR_NOMATCH)) {
138+
#else
139+
if (!(msc_regexec(regex, myvalue, strlen(myvalue), &errptr) == PCRE_ERROR_NOMATCH)) {
140+
#endif
141+
if (msr->txcfg->debuglog_level >= 9) {
142+
msr_log(msr, 9, "fetch_target_exception: Target %s will not be processed.", var->name);
143+
}
144+
match = 1;
145+
}
146+
}
147+
} else if((strlen(myvalue) == strlen(value)) &&
119148
strncasecmp(myvalue,value,strlen(myvalue)) == 0) {
120149
if (msr->txcfg->debuglog_level >= 9) {
121150
msr_log(msr, 9, "fetch_target_exception: Target %s will not be processed.", target);

0 commit comments

Comments
 (0)