|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2014-09-20 11:15 UTC] mail at thomasbachem dot com
Description:
------------
If an empty session ID is given to PHP (e.g. a cookie with "PHPSESSID=; path=/" or simply by calling "session_id('')"), session_start() will throw an E_WARNING error from the default session handler ("session_start(): The session id is too long or contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,'") but still returns true and starts a session.
Now session_id() returns '' (the manual states this only happens if there is no current session), but the session was still started, and custom session save handlers are given an empty session ID. If they don't handle that case, a session handler may then actually save session data for an empty session ID. Even the examples from the manual (http://php.net/manual/en/function.session-set-save-handler.php) don't check for an empty session ID.
Test script:
---------------
<?php
// Could also be set with a cookie like "PHPSESSID=; path=/"
session_id('');
// Will still start the session and return true
var_dump(session_start());
// Returns an empty string
var_dump(session_id());
Expected result:
----------------
I would expect session_start() to regenerate a session ID OR to fail, return false and not trigger any session save handlers.
Actual result:
--------------
Warning: session_start(): The session id is too long or contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,' in emptysession.php on line 5
boolean true
string '' (length=0)
Warning: Unknown: The session id is too long or contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,' in Unknown on line 0
Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct () in Unknown on line 0
Patchesbug68063.patch (last revision 2016-01-12 22:28 UTC by yohgaki@php.net)Pull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Tue Oct 28 17:00:02 2025 UTC |
Fix is committed already, but it's not appropriate. if (PS(id) && !strlen(PS(id))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot start session with empty session ID"); RETURN_FALSE; } The reason why session ID became empty is browser's cookie handling. To workaround this, session module should keep old session ID for a while. https://wiki.php.net/rfc/precise_session_management Session module should not raise error, but generate new when session ID cookie became empty.