Skip to content

Commit 164e5fb

Browse files
committed
fix: prevent creation of fixed sid
1 parent 27d593e commit 164e5fb

2 files changed

Lines changed: 48 additions & 4 deletions

File tree

ext/session/session.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1661,8 +1661,8 @@ PHPAPI zend_result php_session_start(void) /* {{{ */
16611661
* Cookies are preferred, because initially cookie and get
16621662
* variables will be available.
16631663
* URL/POST session ID may be used when use_only_cookies=Off.
1664-
* session.use_strice_mode=On prevents session adoption.
1665-
* Session based file upload progress uses non-cookie ID.
1664+
* session.use_strict_mode=On prevents session adoption.
1665+
* Session based file upload progress respects use_only_cookies.
16661666
*/
16671667

16681668
if (!PS(id)) {
@@ -3223,7 +3223,7 @@ static zend_result php_session_rfc1867_callback(unsigned int event, void *event_
32233223
multipart_event_start *data = (multipart_event_start *) event_data;
32243224
progress = ecalloc(1, sizeof(php_session_rfc1867_progress));
32253225
progress->content_length = data->content_length;
3226-
progress->sname_len = strlen(PS(session_name));
3226+
progress->sname_len = strlen(PS(session_name));
32273227
PS(rfc1867_progress) = progress;
32283228
}
32293229
break;
@@ -3245,7 +3245,7 @@ static zend_result php_session_rfc1867_callback(unsigned int event, void *event_
32453245
if (data->name && data->value && value_len) {
32463246
size_t name_len = strlen(data->name);
32473247

3248-
if (name_len == progress->sname_len && memcmp(data->name, PS(session_name), name_len) == 0) {
3248+
if (!PS(use_only_cookies) && name_len == progress->sname_len && memcmp(data->name, PS(session_name), name_len) == 0) {
32493249
zval_ptr_dtor(&progress->sid);
32503250
ZVAL_STRINGL(&progress->sid, (*data->value), value_len);
32513251
} else if (name_len == strlen(PS(rfc1867_name)) && memcmp(data->name, PS(rfc1867_name), name_len + 1) == 0) {
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
--TEST--
2+
session rfc1867 upload progress does not use form SID when use_only_cookies=1
3+
--INI--
4+
file_uploads=1
5+
upload_max_filesize=1024
6+
session.save_path=
7+
session.name=PHPSESSID
8+
session.use_strict_mode=0
9+
session.use_cookies=1
10+
session.use_only_cookies=1
11+
session.upload_progress.enabled=1
12+
session.upload_progress.cleanup=0
13+
session.upload_progress.prefix=upload_progress_
14+
session.upload_progress.name=PHP_SESSION_UPLOAD_PROGRESS
15+
session.upload_progress.freq=0
16+
session.save_handler=files
17+
--EXTENSIONS--
18+
session
19+
--SKIPIF--
20+
<?php include('skipif.inc'); ?>
21+
--POST_RAW--
22+
Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737
23+
-----------------------------20896060251896012921717172737
24+
Content-Disposition: form-data; name="PHPSESSID"
25+
26+
rfc1867-sid-post-use-only-cookies
27+
-----------------------------20896060251896012921717172737
28+
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
29+
30+
rfc1867_sid_post_use_only_cookies.php
31+
-----------------------------20896060251896012921717172737
32+
Content-Disposition: form-data; name="file1"; filename="file1.txt"
33+
34+
1
35+
-----------------------------20896060251896012921717172737--
36+
--FILE--
37+
<?php
38+
session_id("rfc1867-sid-post-use-only-cookies");
39+
session_start();
40+
var_dump(isset($_SESSION["upload_progress_" . basename(__FILE__)]));
41+
session_destroy();
42+
?>
43+
--EXPECT--
44+
bool(false)

0 commit comments

Comments
 (0)