diff -r 5e7a0fedabdf -r 877f952ae2bd web/lib/Zend/Session.php --- a/web/lib/Zend/Session.php Thu Mar 21 17:31:31 2013 +0100 +++ b/web/lib/Zend/Session.php Thu Mar 21 19:50:53 2013 +0100 @@ -15,9 +15,9 @@ * * @category Zend * @package Zend_Session - * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Session.php 22587 2010-07-16 20:14:18Z ralph $ + * @version $Id: Session.php 25121 2012-11-13 21:51:23Z matthew $ * @since Preview Release 0.2 */ @@ -43,7 +43,7 @@ * * @category Zend * @package Zend_Session - * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Session extends Zend_Session_Abstract @@ -308,24 +308,13 @@ "() before any output has been sent to the browser; output started in {$filename}/{$linenum}"); } - if (self::$_sessionStarted && self::$_regenerateIdState <= 0) { + if ( !self::$_sessionStarted ) { + self::$_regenerateIdState = -1; + } else { if (!self::$_unitTestEnabled) { session_regenerate_id(true); } self::$_regenerateIdState = 1; - } else { - /** - * @todo If we can detect that this requester had no session previously, - * then why regenerate the id before the session has started? - * Feedback wanted for: - // - if (isset($_COOKIE[session_name()]) || (!use only cookies && isset($_REQUEST[session_name()]))) { - self::$_regenerateIdState = 1; - } else { - self::$_regenerateIdState = -1; - } - //*/ - self::$_regenerateIdState = -1; } } @@ -335,7 +324,7 @@ * seconds is specified, then this defaults to self::$_rememberMeSeconds. Due to clock errors on end users' systems, * large values are recommended to avoid undesirable expiration of session cookies. * - * @param $seconds integer - OPTIONAL specifies TTL for cookie in seconds from present time + * @param int $seconds OPTIONAL specifies TTL for cookie in seconds from present time * @return void */ public static function rememberMe($seconds = null) @@ -394,9 +383,9 @@ */ public static function sessionExists() { - if (ini_get('session.use_cookies') == '1' && isset($_COOKIE[session_name()])) { + if ((bool)ini_get('session.use_cookies') == true && isset($_COOKIE[session_name()])) { return true; - } elseif (!empty($_REQUEST[session_name()])) { + } elseif ((bool)ini_get('session.use_only_cookies') == false && isset($_REQUEST[session_name()])) { return true; } elseif (self::$_unitTestEnabled) { return true; @@ -426,6 +415,14 @@ */ public static function start($options = false) { + // Check to see if we've been passed an invalid session ID + if ( self::getId() && !self::_checkId(self::getId()) ) { + // Generate a valid, temporary replacement + self::setId(md5(self::getId())); + // Force a regenerate after session is started + self::$_regenerateIdState = -1; + } + if (self::$_sessionStarted && self::$_destroyed) { require_once 'Zend/Session/Exception.php'; throw new Zend_Session_Exception('The session was explicitly destroyed during this request, attempting to re-start is not allowed.'); @@ -510,6 +507,34 @@ self::_processStartupMetadataGlobal(); } + /** + * Perform a hash-bits check on the session ID + * + * @param string $id Session ID + * @return bool + */ + protected static function _checkId($id) + { + $saveHandler = ini_get('session.save_handler'); + if ($saveHandler == 'cluster') { // Zend Server SC, validate only after last dash + $dashPos = strrpos($id, '-'); + if ($dashPos) { + $id = substr($id, $dashPos + 1); + } + } + + $hashBitsPerChar = ini_get('session.hash_bits_per_character'); + if (!$hashBitsPerChar) { + $hashBitsPerChar = 5; // the default value + } + switch($hashBitsPerChar) { + case 4: $pattern = '^[0-9a-f]*$'; break; + case 5: $pattern = '^[0-9a-v]*$'; break; + case 6: $pattern = '^[0-9a-zA-Z-,]*$'; break; + } + return preg_match('#'.$pattern.'#', $id); + } + /** * _processGlobalMetadata() - this method initizes the sessions GLOBAL @@ -572,13 +597,13 @@ } } if (empty($_SESSION['__ZF'][$namespace]['ENVGH'])) { - unset($_SESSION['__ZF'][$namespace]['ENVGH']); + unset($_SESSION['__ZF'][$namespace]['ENVGH']); } } - } - - if (isset($namespace) && empty($_SESSION['__ZF'][$namespace])) { - unset($_SESSION['__ZF'][$namespace]); + + if (isset($namespace) && empty($_SESSION['__ZF'][$namespace])) { + unset($_SESSION['__ZF'][$namespace]); + } } }