From 048d86b9a6198ebcd5cf23a9e6aa2c9e6e44a80b Mon Sep 17 00:00:00 2001 From: Jorg Sowa <jorg.sowa@gmail.com> Date: Sun, 11 Aug 2024 03:04:44 +0200 Subject: [PATCH 1/6] Added eclusive error message for prefix in session_create_id() larger than 256 --- ext/session/session.c | 3 ++- .../tests/session_create_id_invalid_prefix.phpt | 17 ++++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/ext/session/session.c b/ext/session/session.c index aa9883ab1df33..5f587212995c5 100644 --- a/ext/session/session.c +++ b/ext/session/session.c @@ -368,6 +368,7 @@ PHPAPI zend_result php_session_valid_key(const char *key) /* {{{ */ || (c >= '0' && c <= '9') || c == ',' || c == '-')) { + php_error_docref(NULL, E_WARNING, "Prefix cannot contain special characters. Only the A-Z, a-z, 0-9, \"-\", and \",\" characters are allowed"); return FAILURE; } } @@ -377,6 +378,7 @@ PHPAPI zend_result php_session_valid_key(const char *key) /* {{{ */ /* Somewhat arbitrary length limit here, but should be way more than anyone needs and avoids file-level warnings later on if we exceed MAX_PATH */ if (len == 0 || len > PS_MAX_SID_LENGTH) { + php_error_docref(NULL, E_WARNING, "Prefix cannot be larger than 256 characters"); return FAILURE; } @@ -2385,7 +2387,6 @@ PHP_FUNCTION(session_create_id) if (prefix && ZSTR_LEN(prefix)) { if (php_session_valid_key(ZSTR_VAL(prefix)) == FAILURE) { /* E_ERROR raised for security reason. */ - php_error_docref(NULL, E_WARNING, "Prefix cannot contain special characters. Only the A-Z, a-z, 0-9, \"-\", and \",\" characters are allowed"); RETURN_FALSE; } else { smart_str_append(&id, prefix); diff --git a/ext/session/tests/session_create_id_invalid_prefix.phpt b/ext/session/tests/session_create_id_invalid_prefix.phpt index 0a4e2c2d40013..785c23049e5ab 100644 --- a/ext/session/tests/session_create_id_invalid_prefix.phpt +++ b/ext/session/tests/session_create_id_invalid_prefix.phpt @@ -12,8 +12,12 @@ session var_dump(session_create_id('_')); var_dump(session_create_id('%')); -var_dump(session_create_id("AB\0CD")); - +var_dump(session_create_id('ABTgdPs68S3M4HMaqKwj33TzqLMv5PHpWQxJbfpeogEhrJRY7o9f33pKLCmhf0tXCtoBkIu0yxXYCSHfJhPd2miPUW4MIpd91dnEiOwWDfaBnfdJZOwgvgmYLSfDGaebqmnCAoyuzlcq2j59nNRhccgJIkr9ytY3RwFTTXszpcjpx6mlJuG9GksKAhPsnnaEwSEb0eFyqvn80gYI2roKSjaFSmJxg0xgXuCF4csMo8DxiSvovho5QTKx5u7h8VyQL')); +try { + var_dump(session_create_id("AB\0CD")); +} catch (Throwable $e) { + echo $e->getMessage() . "\n"; +} ?> Done @@ -24,8 +28,7 @@ bool(false) 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 bool(false) -Fatal error: Uncaught ValueError: session_create_id(): Argument #1 ($prefix) must not contain any null bytes in %s:%d -Stack trace: -#0 %s(5): session_create_id('AB\x00CD') -#1 {main} - thrown in %s +Warning: session_create_id(): Prefix cannot be larger than 256 characters in %s on line %d +bool(false) +session_create_id(): Argument #1 ($prefix) must not contain any null bytes +Done From 105cd0ab461fd9dd6d4a3ab7dc89950dbf644e44 Mon Sep 17 00:00:00 2001 From: Jorg Sowa <jorg.sowa@gmail.com> Date: Sun, 11 Aug 2024 03:32:06 +0200 Subject: [PATCH 2/6] Adjusted error in mod_files --- ext/session/mod_files.c | 1 - ext/session/tests/rfc1867_sid_invalid.phpt | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/ext/session/mod_files.c b/ext/session/mod_files.c index 74e77973405b2..83c463823b74f 100644 --- a/ext/session/mod_files.c +++ b/ext/session/mod_files.c @@ -166,7 +166,6 @@ static void ps_files_open(ps_files *data, /* const */ zend_string *key) ps_files_close(data); if (php_session_valid_key(ZSTR_VAL(key)) == FAILURE) { - php_error_docref(NULL, E_WARNING, "Session ID is too long or contains illegal characters. Only the A-Z, a-z, 0-9, \"-\", and \",\" characters are allowed"); return; } diff --git a/ext/session/tests/rfc1867_sid_invalid.phpt b/ext/session/tests/rfc1867_sid_invalid.phpt index fe01b5a8ba2aa..98594ba9073b0 100644 --- a/ext/session/tests/rfc1867_sid_invalid.phpt +++ b/ext/session/tests/rfc1867_sid_invalid.phpt @@ -52,13 +52,13 @@ session_destroy(); @unlink(__DIR__ . DIRECTORY_SEPARATOR . "rfc1867_sid_invalid.post.txt"); ?> --EXPECTF-- -Warning: PHP Request Startup: Session ID is too long or contains illegal characters. Only the A-Z, a-z, 0-9, "-", and "," characters are allowed in Unknown on line 0 +Warning: PHP Request Startup: Prefix cannot contain special characters. Only the A-Z, a-z, 0-9, "-", and "," characters are allowed in Unknown on line 0 Warning: PHP Request Startup: Failed to read session data: files (path: ) in Unknown on line 0 Warning: PHP Request Startup: Failed to write session data (files). Please verify that the current setting of session.save_path is correct () in Unknown on line 0 -Warning: PHP Request Startup: Session ID is too long or contains illegal characters. Only the A-Z, a-z, 0-9, "-", and "," characters are allowed in Unknown on line 0 +Warning: PHP Request Startup: Prefix cannot contain special characters. Only the A-Z, a-z, 0-9, "-", and "," characters are allowed in Unknown on line 0 Warning: PHP Request Startup: Failed to read session data: files (path: ) in Unknown on line 0 From c104f04e1201d0a051d75842d6ceeb543be0cd7d Mon Sep 17 00:00:00 2001 From: Jorg Sowa <jorg.sowa@gmail.com> Date: Sun, 11 Aug 2024 03:41:22 +0200 Subject: [PATCH 3/6] Adjusted error names for prefix or name --- ext/session/session.c | 4 ++-- ext/session/tests/rfc1867_sid_invalid.phpt | 4 ++-- ext/session/tests/session_create_id_invalid_prefix.phpt | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ext/session/session.c b/ext/session/session.c index 5f587212995c5..388c4b6c10e24 100644 --- a/ext/session/session.c +++ b/ext/session/session.c @@ -368,7 +368,7 @@ PHPAPI zend_result php_session_valid_key(const char *key) /* {{{ */ || (c >= '0' && c <= '9') || c == ',' || c == '-')) { - php_error_docref(NULL, E_WARNING, "Prefix cannot contain special characters. Only the A-Z, a-z, 0-9, \"-\", and \",\" characters are allowed"); + php_error_docref(NULL, E_WARNING, "Prefix or name cannot contain special characters. Only the A-Z, a-z, 0-9, \"-\", and \",\" characters are allowed"); return FAILURE; } } @@ -378,7 +378,7 @@ PHPAPI zend_result php_session_valid_key(const char *key) /* {{{ */ /* Somewhat arbitrary length limit here, but should be way more than anyone needs and avoids file-level warnings later on if we exceed MAX_PATH */ if (len == 0 || len > PS_MAX_SID_LENGTH) { - php_error_docref(NULL, E_WARNING, "Prefix cannot be larger than 256 characters"); + php_error_docref(NULL, E_WARNING, "Prefix or name cannot be larger than 256 characters"); return FAILURE; } diff --git a/ext/session/tests/rfc1867_sid_invalid.phpt b/ext/session/tests/rfc1867_sid_invalid.phpt index 98594ba9073b0..be5756507d682 100644 --- a/ext/session/tests/rfc1867_sid_invalid.phpt +++ b/ext/session/tests/rfc1867_sid_invalid.phpt @@ -52,13 +52,13 @@ session_destroy(); @unlink(__DIR__ . DIRECTORY_SEPARATOR . "rfc1867_sid_invalid.post.txt"); ?> --EXPECTF-- -Warning: PHP Request Startup: Prefix cannot contain special characters. Only the A-Z, a-z, 0-9, "-", and "," characters are allowed in Unknown on line 0 +Warning: PHP Request Startup: Prefix or name cannot contain special characters. Only the A-Z, a-z, 0-9, "-", and "," characters are allowed in Unknown on line 0 Warning: PHP Request Startup: Failed to read session data: files (path: ) in Unknown on line 0 Warning: PHP Request Startup: Failed to write session data (files). Please verify that the current setting of session.save_path is correct () in Unknown on line 0 -Warning: PHP Request Startup: Prefix cannot contain special characters. Only the A-Z, a-z, 0-9, "-", and "," characters are allowed in Unknown on line 0 +Warning: PHP Request Startup: Prefix or name cannot contain special characters. Only the A-Z, a-z, 0-9, "-", and "," characters are allowed in Unknown on line 0 Warning: PHP Request Startup: Failed to read session data: files (path: ) in Unknown on line 0 diff --git a/ext/session/tests/session_create_id_invalid_prefix.phpt b/ext/session/tests/session_create_id_invalid_prefix.phpt index 785c23049e5ab..4a25f338037ad 100644 --- a/ext/session/tests/session_create_id_invalid_prefix.phpt +++ b/ext/session/tests/session_create_id_invalid_prefix.phpt @@ -22,13 +22,13 @@ try { ?> Done --EXPECTF-- -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 +Warning: session_create_id(): Prefix or name cannot contain special characters. Only the A-Z, a-z, 0-9, "-", and "," characters are allowed in %s on line %d bool(false) -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 +Warning: session_create_id(): Prefix or name cannot contain special characters. Only the A-Z, a-z, 0-9, "-", and "," characters are allowed in %s on line %d bool(false) -Warning: session_create_id(): Prefix cannot be larger than 256 characters in %s on line %d +Warning: session_create_id(): Prefix or name cannot be larger than 256 characters in %s on line %d bool(false) session_create_id(): Argument #1 ($prefix) must not contain any null bytes Done From 802f9ba4d3efaa114deef1a8d96dfcd13ca4fbb9 Mon Sep 17 00:00:00 2001 From: Jorg Sowa <jorg.sowa@gmail.com> Date: Wed, 14 Aug 2024 22:01:02 +0200 Subject: [PATCH 4/6] Added ValueError and reverted other changes --- ext/session/mod_files.c | 1 + ext/session/session.c | 7 +++++-- ext/session/tests/rfc1867_sid_invalid.post | 13 +++++++++++++ .../tests/session_create_id_invalid_prefix.phpt | 13 +++++-------- 4 files changed, 24 insertions(+), 10 deletions(-) create mode 100644 ext/session/tests/rfc1867_sid_invalid.post diff --git a/ext/session/mod_files.c b/ext/session/mod_files.c index 83c463823b74f..74e77973405b2 100644 --- a/ext/session/mod_files.c +++ b/ext/session/mod_files.c @@ -166,6 +166,7 @@ static void ps_files_open(ps_files *data, /* const */ zend_string *key) ps_files_close(data); if (php_session_valid_key(ZSTR_VAL(key)) == FAILURE) { + php_error_docref(NULL, E_WARNING, "Session ID is too long or contains illegal characters. Only the A-Z, a-z, 0-9, \"-\", and \",\" characters are allowed"); return; } diff --git a/ext/session/session.c b/ext/session/session.c index 388c4b6c10e24..32de7c36d7813 100644 --- a/ext/session/session.c +++ b/ext/session/session.c @@ -368,7 +368,6 @@ PHPAPI zend_result php_session_valid_key(const char *key) /* {{{ */ || (c >= '0' && c <= '9') || c == ',' || c == '-')) { - php_error_docref(NULL, E_WARNING, "Prefix or name cannot contain special characters. Only the A-Z, a-z, 0-9, \"-\", and \",\" characters are allowed"); return FAILURE; } } @@ -378,7 +377,6 @@ PHPAPI zend_result php_session_valid_key(const char *key) /* {{{ */ /* Somewhat arbitrary length limit here, but should be way more than anyone needs and avoids file-level warnings later on if we exceed MAX_PATH */ if (len == 0 || len > PS_MAX_SID_LENGTH) { - php_error_docref(NULL, E_WARNING, "Prefix or name cannot be larger than 256 characters"); return FAILURE; } @@ -2385,8 +2383,13 @@ PHP_FUNCTION(session_create_id) } if (prefix && ZSTR_LEN(prefix)) { + if (ZSTR_LEN(prefix) > PS_MAX_SID_LENGTH) { + zend_argument_value_error(1, "cannot be longer than %d characters", PS_MAX_SID_LENGTH); + RETURN_THROWS(); + } if (php_session_valid_key(ZSTR_VAL(prefix)) == FAILURE) { /* E_ERROR raised for security reason. */ + php_error_docref(NULL, E_WARNING, "Prefix cannot contain special characters. Only the A-Z, a-z, 0-9, \"-\", and \",\" characters are allowed"); RETURN_FALSE; } else { smart_str_append(&id, prefix); diff --git a/ext/session/tests/rfc1867_sid_invalid.post b/ext/session/tests/rfc1867_sid_invalid.post new file mode 100644 index 0000000000000..2ea939023c597 --- /dev/null +++ b/ext/session/tests/rfc1867_sid_invalid.post @@ -0,0 +1,13 @@ +-----------------------------20896060251896012921717172737 +Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS" + +rfc1867_sid_invalid.php +-----------------------------20896060251896012921717172737 +Content-Disposition: form-data; name="file1"; filename="file1.txt" + +1 +-----------------------------20896060251896012921717172737 +Content-Disposition: form-data; name="file2"; filename="file2.txt" + +2 +-----------------------------20896060251896012921717172737-- \ No newline at end of file diff --git a/ext/session/tests/session_create_id_invalid_prefix.phpt b/ext/session/tests/session_create_id_invalid_prefix.phpt index 4a25f338037ad..9be05519ce6ef 100644 --- a/ext/session/tests/session_create_id_invalid_prefix.phpt +++ b/ext/session/tests/session_create_id_invalid_prefix.phpt @@ -12,23 +12,20 @@ session var_dump(session_create_id('_')); var_dump(session_create_id('%')); -var_dump(session_create_id('ABTgdPs68S3M4HMaqKwj33TzqLMv5PHpWQxJbfpeogEhrJRY7o9f33pKLCmhf0tXCtoBkIu0yxXYCSHfJhPd2miPUW4MIpd91dnEiOwWDfaBnfdJZOwgvgmYLSfDGaebqmnCAoyuzlcq2j59nNRhccgJIkr9ytY3RwFTTXszpcjpx6mlJuG9GksKAhPsnnaEwSEb0eFyqvn80gYI2roKSjaFSmJxg0xgXuCF4csMo8DxiSvovho5QTKx5u7h8VyQL')); try { + var_dump(session_create_id('ABTgdPs68S3M4HMaqKwj33TzqLMv5PHpWQxJbfpeogEhrJRY7o9f33pKLCmhf0tXCtoBkIu0yxXYCSHfJhPd2miPUW4MIpd91dnEiOwWDfaBnfdJZOwgvgmYLSfDGaebqmnCAoyuzlcq2j59nNRhccgJIkr9ytY3RwFTTXszpcjpx6mlJuG9GksKAhPsnnaEwSEb0eFyqvn80gYI2roKSjaFSmJxg0xgXuCF4csMo8DxiSvovho5QTKx5u7h8VyQL')); var_dump(session_create_id("AB\0CD")); } catch (Throwable $e) { - echo $e->getMessage() . "\n"; + echo $e::class . ': ' . $e->getMessage() . "\n"; } ?> Done --EXPECTF-- -Warning: session_create_id(): Prefix or name cannot contain special characters. Only the A-Z, a-z, 0-9, "-", and "," characters are allowed in %s on line %d +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 bool(false) -Warning: session_create_id(): Prefix or name cannot contain special characters. Only the A-Z, a-z, 0-9, "-", and "," characters are allowed in %s on line %d +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 bool(false) - -Warning: session_create_id(): Prefix or name cannot be larger than 256 characters in %s on line %d -bool(false) -session_create_id(): Argument #1 ($prefix) must not contain any null bytes +ValueError: session_create_id(): Argument #1 ($prefix) cannot be longer than 256 characters Done From 0a2b1a2756914d3da78dd6dca9bd192400b7185b Mon Sep 17 00:00:00 2001 From: Jorg Sowa <jorg.sowa@gmail.com> Date: Wed, 14 Aug 2024 22:04:20 +0200 Subject: [PATCH 5/6] Fixed test rfc1867_sid_invalid --- ext/session/tests/rfc1867_sid_invalid.phpt | 4 ++-- ext/session/tests/rfc1867_sid_invalid.post | 13 ------------- 2 files changed, 2 insertions(+), 15 deletions(-) delete mode 100644 ext/session/tests/rfc1867_sid_invalid.post diff --git a/ext/session/tests/rfc1867_sid_invalid.phpt b/ext/session/tests/rfc1867_sid_invalid.phpt index be5756507d682..fe01b5a8ba2aa 100644 --- a/ext/session/tests/rfc1867_sid_invalid.phpt +++ b/ext/session/tests/rfc1867_sid_invalid.phpt @@ -52,13 +52,13 @@ session_destroy(); @unlink(__DIR__ . DIRECTORY_SEPARATOR . "rfc1867_sid_invalid.post.txt"); ?> --EXPECTF-- -Warning: PHP Request Startup: Prefix or name cannot contain special characters. Only the A-Z, a-z, 0-9, "-", and "," characters are allowed in Unknown on line 0 +Warning: PHP Request Startup: Session ID is too long or contains illegal characters. Only the A-Z, a-z, 0-9, "-", and "," characters are allowed in Unknown on line 0 Warning: PHP Request Startup: Failed to read session data: files (path: ) in Unknown on line 0 Warning: PHP Request Startup: Failed to write session data (files). Please verify that the current setting of session.save_path is correct () in Unknown on line 0 -Warning: PHP Request Startup: Prefix or name cannot contain special characters. Only the A-Z, a-z, 0-9, "-", and "," characters are allowed in Unknown on line 0 +Warning: PHP Request Startup: Session ID is too long or contains illegal characters. Only the A-Z, a-z, 0-9, "-", and "," characters are allowed in Unknown on line 0 Warning: PHP Request Startup: Failed to read session data: files (path: ) in Unknown on line 0 diff --git a/ext/session/tests/rfc1867_sid_invalid.post b/ext/session/tests/rfc1867_sid_invalid.post deleted file mode 100644 index 2ea939023c597..0000000000000 --- a/ext/session/tests/rfc1867_sid_invalid.post +++ /dev/null @@ -1,13 +0,0 @@ ------------------------------20896060251896012921717172737 -Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS" - -rfc1867_sid_invalid.php ------------------------------20896060251896012921717172737 -Content-Disposition: form-data; name="file1"; filename="file1.txt" - -1 ------------------------------20896060251896012921717172737 -Content-Disposition: form-data; name="file2"; filename="file2.txt" - -2 ------------------------------20896060251896012921717172737-- \ No newline at end of file From 8cf171377425f07fd77276cd03cab9a304cae768 Mon Sep 17 00:00:00 2001 From: Jorg Sowa <jorg.sowa@gmail.com> Date: Wed, 14 Aug 2024 22:06:07 +0200 Subject: [PATCH 6/6] Fixed session_create_id_invalid_prefix test --- ext/session/tests/session_create_id_invalid_prefix.phpt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ext/session/tests/session_create_id_invalid_prefix.phpt b/ext/session/tests/session_create_id_invalid_prefix.phpt index 9be05519ce6ef..7de7e8061f689 100644 --- a/ext/session/tests/session_create_id_invalid_prefix.phpt +++ b/ext/session/tests/session_create_id_invalid_prefix.phpt @@ -12,8 +12,14 @@ session var_dump(session_create_id('_')); var_dump(session_create_id('%')); + try { var_dump(session_create_id('ABTgdPs68S3M4HMaqKwj33TzqLMv5PHpWQxJbfpeogEhrJRY7o9f33pKLCmhf0tXCtoBkIu0yxXYCSHfJhPd2miPUW4MIpd91dnEiOwWDfaBnfdJZOwgvgmYLSfDGaebqmnCAoyuzlcq2j59nNRhccgJIkr9ytY3RwFTTXszpcjpx6mlJuG9GksKAhPsnnaEwSEb0eFyqvn80gYI2roKSjaFSmJxg0xgXuCF4csMo8DxiSvovho5QTKx5u7h8VyQL')); +} catch (Throwable $e) { + echo $e::class . ': ' . $e->getMessage() . "\n"; +} + +try { var_dump(session_create_id("AB\0CD")); } catch (Throwable $e) { echo $e::class . ': ' . $e->getMessage() . "\n"; @@ -28,4 +34,5 @@ bool(false) 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 bool(false) ValueError: session_create_id(): Argument #1 ($prefix) cannot be longer than 256 characters +ValueError: session_create_id(): Argument #1 ($prefix) must not contain any null bytes Done