Session handling functions

PHP Manual
Prev |  | Next

# XCIII. Session handling functions

# Introduction

Session support in PHP consists of a way to preserve certain data across subsequent accesses. This enables you to build more customized applications and increase the appeal of your web site.

If you are familiar with the session management of PHPLIB, you will notice that some concepts are similar to PHP's session support.

A visitor accessing your web site is assigned an unique id, the so-called session id. This is either stored in a cookie on the user side or is propagated in the URL.

The session support allows you to register arbitrary numbers of variables to be preserved across requests. When a visitor accesses your site, PHP will check automatically (if session.auto_start is set to 1) or on your request (explicitly through session_start() or implicitly through session_register()) whether a specific session id has been sent with the request. If this is the case, the prior saved environment is recreated.

All registered variables are serialized after the request finishes. Registered variables which are undefined are marked as being not defined. On subsequent accesses, these are not defined by the session module unless the user defines them later.

> Note: Session handling was added in PHP 4.0.

# Sessions and security

Using sessions, does not mean, you can be absolutely sure, that the session data can only be viewed by that user. This is important to keep in mind, when storing and displaying sensitive information. When storing data into a session, one should always ask themselves, what the damage is, when somebody else views that information, or how your application is affected when this session is actually somebody else.

For instance, if somebody else takes a session, can he then post a message in a forum, as that user and how big of a problem is that? Or perhaps he can view what the original user was thinking of ordering, because he gets access to that user's shopping cart. Obviously for a flowershop, this is less dramatic, than for a pharmacy.

Therefore, when dealing with sensitive information, there should always be additional methods to decide whether it is a valid session. Sessions are not reliable as a secure authentication mechanism.

Sessions rely on the session ID, meaning one can 'steal' a session, by stealing the session ID. This can be made harder, by using a cookie specifically a session cookie, but does not in any way make it impossible and still relies on the user closing all browser windows, to expire the session cookie. Besides that, even session cookies can be sniffed on a network or logged by a proxyserver.

# Requirements

No external libraries are needed to build this extension.

# Installation

Session support is enabled in PHP by default. If you would not like to build your PHP with session support, you should specify the `--disable-session` option to configure.

# Runtime Configuration

The behaviour of these functions is affected by settings in `php.ini`.

Table 1. Session configuration options

Name | Default | Changeable
--- | --- | ---
session.save_path | "/tmp" | PHP_INI_ALL
session.name | "PHPSESSID" | PHP_INI_ALL
session.save_handler | "files" | PHP_INI_ALL
session.auto_start | "0" | PHP_INI_ALL
session.gc_probability | "1" | PHP_INI_ALL
session.gc_maxlifetime | "1440" | PHP_INI_ALL
session.serialize_handler | "php" | PHP_INI_ALL
session.cookie_lifetime | "0" | PHP_INI_ALL
session.cookie_path | "/" | PHP_INI_ALL
session.cookie_domain | "" | PHP_INI_ALL
session.cookie_secure | "" | PHP_INI_ALL
session.use_cookies | "1" | PHP_INI_ALL
session.use_only_cookies | "0" | PHP_INI_ALL
session.referer_check | "" | PHP_INI_ALL
session.entropy_file | "" | PHP_INI_ALL
session.entropy_length | "0" | PHP_INI_ALL
session.cache_limiter | "nocache" | PHP_INI_ALL
session.cache_expire | "180" | PHP_INI_ALL
session.use_trans_sid | "0" | PHP_INI_SYSTEM|PHP_INI_PERDIR
url_rewriter.tags | "a=href,area=href,frame=src,input=src,form=fakeentry" | PHP_INI_ALL

For further details and definition of the PHP_INI_* constants see ini_set().

The session management system supports a number of configuration options which you can place in your `php.ini` file. We will give a short overview.

`session.save_handler` string

  `session.save_handler` defines the name of the handler which is used for storing and retrieving data associated with a session. Defaults to `files`.

`session.save_path` string

  `session.save_path` defines the argument which is passed to the save handler. If you choose the default files handler, this is the path where the files are created. Defaults to `/tmp`. If `session.save_path`'s path depth is more than 2, garbage collection will not be performed.

  Warning
  If you leave this set to a world-readable directory, such as `/tmp` (the default), other users on the server may be able to hijack sessions by getting the list of files in that directory.

  > Note: Windows users have to change this variable in order to use PHP's session functions. Make sure to specify a valid path, e.g.: `c:/temp`.

`session.name` string

  `session.name` specifies the name of the session which is used as cookie name. It should only contain alphanumeric characters. Defaults to `PHPSESSID`.

`session.auto_start` boolean

  `session.auto_start` specifies whether the session module starts a session automatically on request startup. Defaults to `0` (disabled).

`session.cookie_lifetime` integer

  `session.cookie_lifetime` specifies the lifetime of the cookie in seconds which is sent to the browser. The value 0 means "until the browser is closed." Defaults to `0`.

`session.serialize_handler` string

  `session.serialize_handler` defines the name of the handler which is used to serialize/deserialize data. Currently, a PHP internal format (name `php`) and WDDX is supported (name `wddx`). WDDX is only available, if PHP is compiled with WDDX support. Defaults to `php`.

`session.gc_probability` integer

  `session.gc_probability` specifies the probability that the gc (garbage collection) routine is started on each request in percent. Defaults to `1`.

`session.gc_maxlifetime` integer

  `session.gc_maxlifetime` specifies the number of seconds after which data will be seen as 'garbage' and cleaned up.

  > Note: If you are using the default file-based session handler, your filesystem must keep track of access times (atime). Windows FAT does not so you will have to come up with another way to handle garbage collecting your session if you are stuck with a FAT filesystem or any other fs where atime tracking is not available.

`session.referer_check` string

  `session.referer_check` contains the substring you want to check each HTTP Referer for. If the Referer was sent by the client and the substring was not found, the embedded session id will be marked as invalid. Defaults to the empty string.

`session.entropy_file` string

  `session.entropy_file` gives a path to an external resource (file) which will be used as an additional entropy source in the session id creation process. Examples are `/dev/random` or `/dev/urandom` which are available on many Unix systems.

`session.entropy_length` integer

  `session.entropy_length` specifies the number of bytes which will be read from the file specified above. Defaults to `0` (disabled).

`session.use_cookies` boolean

  `session.use_cookies` specifies whether the module will use cookies to store the session id on the client side. Defaults to `1` (enabled).

`session.use_only_cookies` boolean

  `session.use_only_cookies` specifies whether the module will only use cookies to store the session id on the client side. Defaults to `0` (disabled, for backward compatibility). Enabling this setting prevents attacks involved passing session ids in URLs. This setting was added in `PHP` 4.3.0.

`session.cookie_path` string

  `session.cookie_path` specifies path to set in session_cookie. Defaults to `/`.

`session.cookie_domain` string

  `session.cookie_domain` specifies domain to set in session_cookie. Default is none at all.

`session.cache_limiter` string

  `session.cache_limiter` specifies cache control method to use for session pages (none/nocache/private/private_no_expire/public). Defaults to `nocache`.

`session.cache_expire` integer

  `session.cache_expire` specifies time-to-live for cached session pages in minutes, this has no effect for nocache limiter. Defaults to `180`.

`session.use_trans_sid` boolean

  `session.use_trans_sid` whether transparent sid support is enabled or not. Defaults to `0` (disabled).

  > Note: For PHP 4.1.2 or less, it is enabled by compiling with `--enable-trans-sid`. From PHP 4.2.0, trans-sid feature is always compiled.

  > URL based session management has additional security risks compared to cookie based session management. Users may send an URL that contains an active session ID to their friends by email or users may save an URL that contains a session ID to their bookmarks and access your site with the same session ID always, for example.

`url_rewriter.tags` string

  `url_rewriter.tags` specifies which html tags are rewritten to include session id if transparent sid support is enabled. Defaults to `a=href,area=href,frame=src,input=src,form=fakeentry`

The `track_vars` and `register_globals` configuration settings influence how the session variables get stored and restored.

> Note: As of PHP 4.0.3, `track_vars` is always turned on.

# Resource Types

This extension has no resource types defined.

# Predefined Constants

The constants below are defined by this extension, and will only be available when the extension has either been compiled into PHP or dynamically loaded at runtime.

`SID` (string)

  Constant containing the session name and session ID in the form of `"name=ID"`.

# Examples

> Note: As of PHP 4.1.0, `$_SESSION` is available as global variable just like `$_POST`, `$_GET`, `$_REQUEST` and so on. Unlike `$HTTP_SESSION_VARS`, `$_SESSION` is always global. Therefore, you do not need to use the global keyword for `$_SESSION`. Please note that this documentation has been changed to use `$_SESSION` everywhere. You can substitute `$HTTP_SESSION_VARS` for `$_SESSION`, if you prefer the former.

> The keys in the `$_SESSION` associative array are subject to the same limitations as regular variable names in PHP, i.e. they cannot start with a number and must start with a letter or underscore. For more details see the section on variables in this manual.

If `register_globals` is disabled, only members of the global associative array `$_SESSION` can be registered as session variables. The restored session variables will only be available in the array `$_SESSION`.

Use of `$_SESSION` (or `$HTTP_SESSION_VARS` with PHP 4.0.6 or less) is recommended for improved security and code readablity. With `$_SESSION`, there is no need to use the session_register(), session_unregister(), session_is_registered() functions. Session variables are accessible like any other variables.

Example 1. Registering a variable with $_SESSION.
    <?php
    session_start();
    // Use $HTTP_SESSION_VARS with PHP 4.0.6 or less
    if (!isset($_SESSION['count'])) {
        $_SESSION['count'] = 0;
    } else {
        $_SESSION['count']++;
    }
    ?>

Example 2. Unregistering a variable with $_SESSION and register_globals disabled.
    <?php
    session_start();
    // Use $HTTP_SESSION_VARS with PHP 4.0.6 or less
    unset($_SESSION['count']);
    ?>

Example 3. Unregistering a variable with register_globals enabled, after registering it using $_SESSION.
    <?php
    session_start();
    // With PHP 4.3 and later, you can also simply use the prior example.
    session_unregister('count');
    ?>

If `register_globals` is enabled, then each global variable can be registered as session variable. Upon a restart of a session, these variables will be restored to corresponding global variables. Since PHP must know which global variables are registered as session variables, users need to register variables with session_register() function. You can avoid this by simply setting entries in `$_SESSION`.

Caution
If you are using `$_SESSION` and disable `register_globals`, do not use session_register(), session_is_registered() and session_unregister(), if your scripts shall work in PHP 4.2 and earlier. You can use these functions in 4.3 and later. If you enable `register_globals`, session_unregister() should be used since session variables are registered as global variables when session data is deserialized. Disabling `register_globals` is recommended for both security and performance reasons.

Example 4. Registering a variable with `register_globals` enabled
    <?php
    if (!session_is_registered('count')) {
        session_register("count");
        $count = 0;
    }
    else {
        $count++;
    }
    ?>

If `register_globals` is enabled, then the global variables and the `$_SESSION` entries will automatically reference the same value for session variables which were registered in prior session instances.

Additionally, if you register a new session variable by using session_register(), the entry in the global scope and the `$_SESSION` entry will not reference the same value until the next session_start() (this applies to PHP 4.2 and before only). I.e. a modification to the global variable will not be reflected by the `$_SESSION` entry. This is unlikely to matter in practice and has been corrected in PHP 4.3.

# Passing the Session ID

There are two methods to propagate a session id:

- Cookies

- URL parameter

The session module supports both methods. Cookies are optimal, but since they are not reliable (clients are not bound to accept them), we cannot rely on them. The second method embeds the session id directly into URLs.

PHP is capable of doing this transparently if compiled with `--enable-trans-sid`. This option is always enabled in PHP 4.2 and later. If you enable this option, relative URIs will be changed to contain the session id automatically. Alternatively, you can use the constant `SID` which is defined, if the client did not send the appropriate cookie. `SID` is either of the form `session_name=session_id` or is an empty string.

> Note: The arg_separator.output `php.ini` directive allows to customize the argument seperator.

The following example demonstrates how to register a variable, and how to link correctly to another page using SID.

Example 5. Counting the number of hits of a single user
    <?php
    if (!session_is_registered('count')) {
        session_register('count');
        $count = 1;
    }
    else {
        $count++;
    }
    ?>

    Hello visitor, you have seen this page <?php echo $count; ?> times.<p>

    To continue, <A HREF="nextpage.php?<?php echo SID?>">click here</A>

The `<?php echo SID?>` (`<?=SID?>` can be used if short_open_tag is enabled) is necessary to preserve the session id in the case that the user has disabled cookies. The `<?=SID?>` is not necessary, if `--enable-trans-sid` was used to compile PHP.

> Note: Non-relative URLs are assumed to point to external sites and hence don't append the SID, as it would be a security risk to leak the SID to a different server.

# Custom Session Handlers

To implement database storage, or any other storage method, you will need to use session_set_save_handler() to create a set of user-level storage functions.

Prev | Home | Next
sesam_settransaction | Up | session_cache_expire