Skip to content

Commit 8e1561c

Browse files
authored
Check session_create_id() input for null byte (php#14728)
1 parent c14fa48 commit 8e1561c

File tree

3 files changed

+44
-7
lines changed

3 files changed

+44
-7
lines changed

ext/session/session.c

+5-7
Original file line numberDiff line numberDiff line change
@@ -360,17 +360,15 @@ PHPAPI zend_result php_session_valid_key(const char *key) /* {{{ */
360360
size_t len;
361361
const char *p;
362362
char c;
363-
zend_result ret = SUCCESS;
364363

365364
for (p = key; (c = *p); p++) {
366-
/* valid characters are a..z,A..Z,0..9 */
365+
/* valid characters are [a-z], [A-Z], [0-9], - (hyphen) and , (comma) */
367366
if (!((c >= 'a' && c <= 'z')
368367
|| (c >= 'A' && c <= 'Z')
369368
|| (c >= '0' && c <= '9')
370369
|| c == ','
371370
|| c == '-')) {
372-
ret = FAILURE;
373-
break;
371+
return FAILURE;
374372
}
375373
}
376374

@@ -379,10 +377,10 @@ PHPAPI zend_result php_session_valid_key(const char *key) /* {{{ */
379377
/* Somewhat arbitrary length limit here, but should be way more than
380378
anyone needs and avoids file-level warnings later on if we exceed MAX_PATH */
381379
if (len == 0 || len > PS_MAX_SID_LENGTH) {
382-
ret = FAILURE;
380+
return FAILURE;
383381
}
384382

385-
return ret;
383+
return SUCCESS;
386384
}
387385
/* }}} */
388386

@@ -2374,7 +2372,7 @@ PHP_FUNCTION(session_create_id)
23742372
zend_string *prefix = NULL, *new_id;
23752373
smart_str id = {0};
23762374

2377-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|S", &prefix) == FAILURE) {
2375+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|P", &prefix) == FAILURE) {
23782376
RETURN_THROWS();
23792377
}
23802378

ext/session/tests/session_create_id_basic.phpt

+8
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ echo "*** Testing session_create_id() : basic functionality ***\n";
1616

1717
// No session
1818
var_dump(session_create_id());
19+
var_dump(session_create_id(''));
20+
var_dump(session_create_id(','));
21+
var_dump(session_create_id('-'));
22+
var_dump(session_create_id('0123456789'));
1923
var_dump(session_create_id('ABCD'));
2024

2125
ini_set('session.use_strict_mode', true);
@@ -42,6 +46,10 @@ ob_end_flush();
4246
--EXPECTF--
4347
*** Testing session_create_id() : basic functionality ***
4448
string(32) "%s"
49+
string(32) "%s"
50+
string(33) ",%s"
51+
string(33) "-%s"
52+
string(42) "0123456789%s"
4553
string(36) "ABCD%s"
4654
string(35) "XYZ%s"
4755
string(0) ""
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
--TEST--
2+
Test session_create_id() function : invalid prefix
3+
--INI--
4+
session.save_handler=files
5+
session.sid_length=32
6+
--EXTENSIONS--
7+
session
8+
--SKIPIF--
9+
<?php include('skipif.inc'); ?>
10+
--FILE--
11+
<?php
12+
13+
var_dump(session_create_id('_'));
14+
var_dump(session_create_id('%'));
15+
var_dump(session_create_id("AB\0CD"));
16+
17+
18+
?>
19+
Done
20+
--EXPECTF--
21+
Warning: session_create_id(): Prefix cannot contain special characters. Only the A-Z, a-z, 0-9, "-", and "," characters are allowed in %s on line %d
22+
bool(false)
23+
24+
Warning: session_create_id(): Prefix cannot contain special characters. Only the A-Z, a-z, 0-9, "-", and "," characters are allowed in %s on line %d
25+
bool(false)
26+
27+
Fatal error: Uncaught ValueError: session_create_id(): Argument #1 ($prefix) must not contain any null bytes in %s:%d
28+
Stack trace:
29+
#0 %s(5): session_create_id('AB\x00CD')
30+
#1 {main}
31+
thrown in %s

0 commit comments

Comments
 (0)