Merge pull request #20135 from kamil-tekiela/Session-getToken

Create a oneliner Session::getToken()

Fixes #20112
This commit is contained in:
Maurício Meneghini Fauth 2026-02-19 22:15:07 -03:00 committed by GitHub
commit 86eeab53bf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 27 additions and 32 deletions

View File

@ -6990,12 +6990,6 @@ parameters:
count: 1
path: src/Http/Middleware/StatementHistory.php
-
message: '#^Parameter \#1 \$known_string of function hash_equals expects string, mixed given\.$#'
identifier: argument.type
count: 1
path: src/Http/Middleware/TokenRequestParamChecking.php
-
message: '#^Method PhpMyAdmin\\Http\\ServerRequest\:\:getAttributes\(\) return type has no value type specified in iterable type array\.$#'
identifier: missingType.iterableValue
@ -11619,12 +11613,6 @@ parameters:
count: 1
path: src/Server/SysInfo/WindowsNt.php
-
message: '#^Construct empty\(\) is not allowed\. Use more strict comparison\.$#'
identifier: empty.notAllowed
count: 3
path: src/Session.php
-
message: '#^Only booleans are allowed in &&, string\|false given on the left side\.$#'
identifier: booleanAnd.leftNotBoolean

View File

@ -4897,11 +4897,6 @@
<code><![CDATA[Current::$sqlQuery]]></code>
</MixedArgument>
</file>
<file src="src/Http/Middleware/TokenRequestParamChecking.php">
<MixedArgument>
<code><![CDATA[$_SESSION[' PMA_token ']]]></code>
</MixedArgument>
</file>
<file src="src/Http/Middleware/UriSchemeUpdating.php">
<PossiblyUnusedMethod>
<code><![CDATA[__construct]]></code>
@ -8466,7 +8461,6 @@
<code><![CDATA[$params['server']]]></code>
<code><![CDATA[$params['server']]]></code>
<code><![CDATA[$value]]></code>
<code><![CDATA[$values['token']]]></code>
</MixedAssignment>
</file>
<file src="src/UserPassword.php">

View File

@ -14,6 +14,7 @@ use PhpMyAdmin\Http\Response;
use PhpMyAdmin\Http\ServerRequest;
use PhpMyAdmin\I18n\LanguageManager;
use PhpMyAdmin\ResponseRenderer;
use PhpMyAdmin\Session;
use PhpMyAdmin\Setup\Index;
use PhpMyAdmin\Setup\SetupHelper;
use PhpMyAdmin\Template;
@ -104,7 +105,7 @@ final class HomeController implements InvocableController
'auth_type' => $configFile->getValue('Servers/' . $id . '/auth_type'),
'dsn' => $configFile->getServerDSN($id),
'params' => [
'token' => $_SESSION[' PMA_token '],
'token' => Session::getToken(),
'edit' => ['page' => 'servers', 'mode' => 'edit', 'id' => $id],
'remove' => ['page' => 'servers', 'mode' => 'remove', 'id' => $id],
],

View File

@ -122,7 +122,7 @@ class Header
'server' => Current::$server,
'table' => Current::$table,
'db' => Current::$database,
'token' => $_SESSION[' PMA_token '],
'token' => Session::getToken(),
'text_dir' => LanguageManager::$textDirection->value,
'LimitChars' => $this->config->config->limitChars,
'pftext' => $pftext,

View File

@ -8,6 +8,7 @@ use PhpMyAdmin\Exceptions\MismatchedSessionId;
use PhpMyAdmin\Http\ServerRequest;
use PhpMyAdmin\Message;
use PhpMyAdmin\ResponseRenderer;
use PhpMyAdmin\Session;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
@ -49,7 +50,7 @@ final readonly class TokenRequestParamChecking implements MiddlewareInterface
public function checkTokenRequestParam(ServerRequest $request): ResponseInterface|null
{
$token = $request->getParsedBodyParamAsString('token', '');
if ($token !== '' && hash_equals($_SESSION[' PMA_token '], $token)) {
if ($token !== '' && hash_equals(Session::getToken(), $token)) {
return null;
}

View File

@ -88,7 +88,7 @@ class AuthenticationCookie extends AuthenticationPlugin
*/
if ($sessionExpired) {
$this->responseRenderer->setRequestStatus(false);
$this->responseRenderer->addJSON('new_token', $_SESSION[' PMA_token ']);
$this->responseRenderer->addJSON('new_token', Session::getToken());
}
/**
@ -453,7 +453,7 @@ class AuthenticationCookie extends AuthenticationPlugin
if (isset($_REQUEST['session_timedout'])) {
$this->responseRenderer->addJSON('logged_in', 1);
$this->responseRenderer->addJSON('success', 1);
$this->responseRenderer->addJSON('new_token', $_SESSION[' PMA_token ']);
$this->responseRenderer->addJSON('new_token', Session::getToken());
return $this->responseRenderer->response();
}

View File

@ -12,6 +12,7 @@ use function htmlspecialchars;
use function implode;
use function ini_get;
use function ini_set;
use function is_string;
use function preg_replace;
use function session_abort;
use function session_cache_limiter;
@ -38,6 +39,10 @@ class Session
*/
private static function generateToken(): void
{
/**
* Token which is used for authenticating access queries.
* (we use "space PMA_token space" to prevent overwriting)
*/
$_SESSION[' PMA_token '] = Util::generateRandom(16, true);
$_SESSION[' HMAC_secret '] = Util::generateRandom(16);
@ -45,13 +50,22 @@ class Session
* Check if token is properly generated (the generation can fail, for example
* due to missing /dev/random for openssl).
*/
if (! empty($_SESSION[' PMA_token '])) {
if (self::getToken() !== '') {
return;
}
throw new SessionHandlerException('Failed to generate random CSRF token!');
}
public static function getToken(): string
{
if (isset($_SESSION[' PMA_token ']) && is_string($_SESSION[' PMA_token '])) {
return $_SESSION[' PMA_token '];
}
return '';
}
/**
* tries to secure session from hijacking and fixation
* should be called before login and after successful login
@ -192,11 +206,7 @@ class Session
self::sessionFailed($errors);
}
/**
* Token which is used for authenticating access queries.
* (we use "space PMA_token space" to prevent overwriting)
*/
if (! empty($_SESSION[' PMA_token '])) {
if (self::getToken() !== '') {
return;
}
@ -219,7 +229,7 @@ class Session
// A third cookie will be sent by session_regenerate_id() which will override these two
session_start();
if (! empty($_SESSION[' PMA_token '])) {
if (self::getToken() !== '') {
return;
}

View File

@ -124,8 +124,9 @@ class Url
$fields = '';
/* Always include token in plain forms */
if ($isToken === false && isset($_SESSION[' PMA_token '])) {
$values['token'] = $_SESSION[' PMA_token '];
$token = Session::getToken();
if ($isToken === false && $token !== '') {
$values['token'] = $token;
}
foreach ($values as $name => $value) {