diff --git a/src/wp-includes/load.php b/src/wp-includes/load.php index 77e17b3f8b877..520902cdd64ba 100644 --- a/src/wp-includes/load.php +++ b/src/wp-includes/load.php @@ -126,7 +126,12 @@ function wp_populate_basic_auth_from_authorization_header() { $token = substr( $header, 6 ); $userpass = base64_decode( $token ); - list( $user, $pass ) = explode( ':', $userpass ); + // There must be at least one colon in the string. + if ( ! str_contains( $userpass, ':' ) ) { + return; + } + + list( $user, $pass ) = explode( ':', $userpass, 2 ); // Now shove them in the proper keys where we're expecting later on. $_SERVER['PHP_AUTH_USER'] = $user; diff --git a/tests/phpunit/tests/auth.php b/tests/phpunit/tests/auth.php index facd456dd0227..8ab32d9f69639 100644 --- a/tests/phpunit/tests/auth.php +++ b/tests/phpunit/tests/auth.php @@ -844,4 +844,46 @@ public function data_application_passwords_can_use_capability_checks_to_determin 'not allowed' => array( 'subscriber', false ), ); } + + /* + * @ticket 57512 + * @covers ::wp_populate_basic_auth_from_authorization_header + */ + public function tests_basic_http_authentication_with_username_and_password() { + // Header passed as "username:password". + $_SERVER['HTTP_AUTHORIZATION'] = 'Basic dXNlcm5hbWU6cGFzc3dvcmQ='; + + wp_populate_basic_auth_from_authorization_header(); + + $this->assertSame( $_SERVER['PHP_AUTH_USER'], 'username' ); + $this->assertSame( $_SERVER['PHP_AUTH_PW'], 'password' ); + } + + /* + * @ticket 57512 + * @covers ::wp_populate_basic_auth_from_authorization_header + */ + public function tests_basic_http_authentication_with_username_only() { + // Malformed header passed as "username" with no password. + $_SERVER['HTTP_AUTHORIZATION'] = 'Basic dXNlcm5hbWU='; + + wp_populate_basic_auth_from_authorization_header(); + + $this->assertArrayNotHasKey( 'PHP_AUTH_USER', $_SERVER ); + $this->assertArrayNotHasKey( 'PHP_AUTH_PW', $_SERVER ); + } + + /* + * @ticket 57512 + * @covers ::wp_populate_basic_auth_from_authorization_header + */ + public function tests_basic_http_authentication_with_colon_in_password() { + // Header passed as "username:pass:word" where password contains colon. + $_SERVER['HTTP_AUTHORIZATION'] = 'Basic dXNlcm5hbWU6cGFzczp3b3Jk'; + + wp_populate_basic_auth_from_authorization_header(); + + $this->assertSame( $_SERVER['PHP_AUTH_USER'], 'username' ); + $this->assertSame( $_SERVER['PHP_AUTH_PW'], 'pass:word' ); + } }