Skip to content

Commit eabc39a

Browse files
committed
Added SecCookieV0Separator
1 parent b3418be commit eabc39a

File tree

3 files changed

+37
-2
lines changed

3 files changed

+37
-2
lines changed

apache2/apache2_config.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ void *create_directory_config(apr_pool_t *mp, char *path)
6464

6565
dcfg->cookie_format = NOT_SET;
6666
dcfg->argument_separator = NOT_SET;
67+
dcfg->cookiev0_separator = NOT_SET_P;
6768

6869
dcfg->rule_inheritance = NOT_SET;
6970
dcfg->rule_exceptions = apr_array_make(mp, 16, sizeof(rule_exception *));
@@ -366,6 +367,8 @@ void *merge_directory_configs(apr_pool_t *mp, void *_parent, void *_child)
366367
? parent->cookie_format : child->cookie_format);
367368
merged->argument_separator = (child->argument_separator == NOT_SET
368369
? parent->argument_separator : child->argument_separator);
370+
merged->cookiev0_separator = (child->cookiev0_separator == NOT_SET_P
371+
? parent->cookiev0_separator : child->cookiev0_separator);
369372

370373

371374
/* rule inheritance */
@@ -627,6 +630,7 @@ void init_directory_config(directory_config *dcfg)
627630

628631
if (dcfg->cookie_format == NOT_SET) dcfg->cookie_format = 0;
629632
if (dcfg->argument_separator == NOT_SET) dcfg->argument_separator = '&';
633+
if (dcfg->cookiev0_separator == NOT_SET_P) dcfg->cookiev0_separator = NULL;
630634

631635
if (dcfg->rule_inheritance == NOT_SET) dcfg->rule_inheritance = 1;
632636

@@ -1084,6 +1088,20 @@ static const char *cmd_marker(cmd_parms *cmd, void *_dcfg, const char *p1)
10841088
return add_marker(cmd, (directory_config *)_dcfg, SECMARKER_TARGETS, SECMARKER_ARGS, action);
10851089
}
10861090

1091+
static const char *cmd_cookiev0_separator(cmd_parms *cmd, void *_dcfg,
1092+
const char *p1)
1093+
{
1094+
directory_config *dcfg = (directory_config *)_dcfg;
1095+
1096+
if (strlen(p1) != 1) {
1097+
return apr_psprintf(cmd->pool, "ModSecurity: Invalid cookie v0 separator: %s", p1);
1098+
}
1099+
1100+
dcfg->cookiev0_separator = p1;
1101+
1102+
return NULL;
1103+
}
1104+
10871105
static const char *cmd_argument_separator(cmd_parms *cmd, void *_dcfg,
10881106
const char *p1)
10891107
{
@@ -2785,6 +2803,14 @@ const command_rec module_directives[] = {
27852803
"character that will be used as separator when parsing application/x-www-form-urlencoded content."
27862804
),
27872805

2806+
AP_INIT_TAKE1 (
2807+
"SecCookiev0Separator",
2808+
cmd_cookiev0_separator,
2809+
NULL,
2810+
CMD_SCOPE_ANY,
2811+
"character that will be used as separator when parsing cookie v0 content."
2812+
),
2813+
27882814
AP_INIT_TAKE1 (
27892815
"SecAuditEngine",
27902816
cmd_audit_engine,

apache2/modsecurity.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,7 @@ struct directory_config {
468468

469469
int cookie_format;
470470
int argument_separator;
471+
const char *cookiev0_separator;
471472

472473
int rule_inheritance;
473474
apr_array_header_t *rule_exceptions;

apache2/msc_parsers.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,11 @@ int parse_cookies_v0(modsec_rec *msr, char *_cookie_header,
3535
cookie_header = strdup(_cookie_header);
3636
if (cookie_header == NULL) return -1;
3737

38-
p = apr_strtok(cookie_header, delim, &saveptr);
38+
if(msr->txcfg->cookiev0_separator == NULL) {
39+
p = apr_strtok(cookie_header, delim, &saveptr);
40+
} else {
41+
p = apr_strtok(cookie_header, msr->txcfg->cookiev0_separator, &saveptr);
42+
}
3943

4044
while(p != NULL) {
4145
attr_name = NULL;
@@ -74,7 +78,11 @@ int parse_cookies_v0(modsec_rec *msr, char *_cookie_header,
7478
cookie_count++;
7579
}
7680

77-
p = apr_strtok(NULL, delim, &saveptr);
81+
if(msr->txcfg->cookiev0_separator == NULL) {
82+
p = apr_strtok(NULL, delim, &saveptr);
83+
} else {
84+
p = apr_strtok(NULL, msr->txcfg->cookiev0_separator, &saveptr);
85+
}
7886
}
7987

8088
free(cookie_header);

0 commit comments

Comments
 (0)