2002-04-15 00:12:54 +00:00
|
|
|
<?xml version="1.0" encoding="iso-8859-1"?>
|
2002-12-17 10:17:29 +00:00
|
|
|
<!-- $Revision: 1.26 $ -->
|
2002-04-15 00:12:54 +00:00
|
|
|
<reference id="ref.session">
|
2002-05-25 16:35:24 +00:00
|
|
|
<title>Session handling functions</title>
|
|
|
|
<titleabbrev>Sessions</titleabbrev>
|
2002-09-14 21:26:46 +00:00
|
|
|
|
2002-04-15 00:12:54 +00:00
|
|
|
<partintro>
|
2002-07-28 14:04:32 +00:00
|
|
|
|
|
|
|
<section id="session.intro">
|
|
|
|
&reftitle.intro;
|
|
|
|
<para>
|
|
|
|
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.
|
|
|
|
</para>
|
|
|
|
<para>
|
|
|
|
If you are familiar with the session management of PHPLIB, you
|
|
|
|
will notice that some concepts are similar to PHP's session
|
|
|
|
support.
|
|
|
|
</para>
|
|
|
|
<para>
|
|
|
|
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.
|
|
|
|
</para>
|
|
|
|
<para>
|
|
|
|
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
|
|
|
|
<function>session_start</function> or implicitly through
|
|
|
|
<function>session_register</function>) whether a specific session
|
|
|
|
id has been sent with the request. If this is the case, the prior
|
|
|
|
saved environment is recreated.
|
|
|
|
</para>
|
|
|
|
<para>
|
|
|
|
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.
|
|
|
|
</para>
|
|
|
|
<note>
|
|
|
|
<para>
|
|
|
|
Session handling was added in PHP 4.0.
|
|
|
|
</para>
|
|
|
|
</note>
|
2002-12-01 22:06:11 +00:00
|
|
|
<note>
|
|
|
|
<para>
|
2002-12-01 23:32:11 +00:00
|
|
|
Please note when working with sessions that a record of a session
|
|
|
|
is not created until a variable has been registered using the
|
|
|
|
<function>session_register</function> function or by adding a new
|
|
|
|
key to the <varname>$_SESSION</varname> superglobal array. This
|
|
|
|
holds true regardless of if a session has been started using the
|
|
|
|
<function>session_start</function> function.
|
2002-12-01 22:06:11 +00:00
|
|
|
</para>
|
|
|
|
</note>
|
2002-07-28 14:04:32 +00:00
|
|
|
</section>
|
|
|
|
|
2002-08-14 22:25:22 +00:00
|
|
|
<section id="session.security">
|
|
|
|
<title>Sessions and security</title>
|
|
|
|
<para>
|
2002-12-17 10:17:29 +00:00
|
|
|
The session module cannot guarantee that the information you store
|
|
|
|
in a session is only viewed by the user who created the session. You need
|
|
|
|
to take additional measures to actively protect the integrity of the
|
|
|
|
session, depending on the value associated with it.
|
2002-08-14 22:25:22 +00:00
|
|
|
</para>
|
|
|
|
<para>
|
2002-12-17 10:17:29 +00:00
|
|
|
Assess the importance of the data carried by your sessions and deploy
|
|
|
|
addditional protections -- this usually comes at a price, reduced
|
|
|
|
convenience for the user. For example, if you want to protect users from
|
|
|
|
simple social engineering tactics, you need to enable
|
|
|
|
session.use_only_cookies. In that case, cookies must be enabled
|
|
|
|
unconditionally.
|
2002-08-14 22:25:22 +00:00
|
|
|
</para>
|
|
|
|
<para>
|
2002-12-17 10:17:29 +00:00
|
|
|
There are several ways to leak an existing session id to third parties.
|
|
|
|
A leaked session id enables the third party to access all resources which
|
|
|
|
are associated with a specific id. First, URLs carrying session ids. If
|
|
|
|
you link to an external site, the URL including the session id might be
|
|
|
|
stored in the external site's referrer logs. Second, a more active
|
|
|
|
attacker might listen to your network traffic. If it is not encrypted,
|
|
|
|
session ids will flow in plain text over the network. The solution here
|
|
|
|
is to implement SSL on your server and make it mandatory for users.
|
2002-08-14 22:25:22 +00:00
|
|
|
</para>
|
|
|
|
</section>
|
2002-07-28 14:04:32 +00:00
|
|
|
<section id="session.requirements">
|
|
|
|
&reftitle.required;
|
|
|
|
&no.requirement;
|
2002-12-02 12:55:46 +00:00
|
|
|
<note>
|
|
|
|
<para>
|
|
|
|
Optionally you can use shared memory allocation (mm), developed by
|
|
|
|
Ralf S. Engelschall, for session storage. You have to download
|
2002-12-03 18:21:04 +00:00
|
|
|
<ulink url="&url.mm;">mm</ulink> and install it. This option is not
|
2002-12-17 10:17:29 +00:00
|
|
|
available for Windows platforms. Note that the session storage module
|
|
|
|
for mm does not guarantee that concurrent accesses to the same session
|
|
|
|
are properly locked. It might be more appropiate to use a shared memory
|
|
|
|
based filesystem (such as tmpfs on Solaris/Linux, or /dev/md on BSD) to
|
|
|
|
store sessions in files, because they are properly locked.
|
2002-12-02 12:55:46 +00:00
|
|
|
</para>
|
|
|
|
</note>
|
2002-07-28 14:04:32 +00:00
|
|
|
</section>
|
2002-04-15 00:12:54 +00:00
|
|
|
|
2002-12-02 12:55:46 +00:00
|
|
|
&reference.session.configure;
|
2002-07-28 14:04:32 +00:00
|
|
|
|
2002-09-14 21:26:46 +00:00
|
|
|
&reference.session.ini;
|
2002-07-28 14:04:32 +00:00
|
|
|
|
|
|
|
<section id="session.resources">
|
|
|
|
&reftitle.resources;
|
|
|
|
&no.resource;
|
|
|
|
</section>
|
|
|
|
|
|
|
|
&reference.session.constants;
|
|
|
|
|
|
|
|
<section id="session.examples">
|
|
|
|
&reftitle.examples;
|
|
|
|
<note>
|
|
|
|
<para>
|
|
|
|
As of PHP 4.1.0, <varname>$_SESSION</varname> is available as
|
|
|
|
global variable just like <varname>$_POST</varname>,
|
|
|
|
<varname>$_GET</varname>, <varname>$_REQUEST</varname> and so on.
|
2002-10-03 07:54:36 +00:00
|
|
|
Unlike <varname>$HTTP_SESSION_VARS</varname>,
|
|
|
|
<varname>$_SESSION</varname> is always global. Therefore, you do not
|
2002-10-07 10:47:15 +00:00
|
|
|
need to use the <link
|
|
|
|
linkend="language.variables.scope"><command>global</command></link>
|
|
|
|
keyword for <varname>$_SESSION</varname>. Please note that this
|
|
|
|
documentation has been changed to use
|
|
|
|
<varname>$_SESSION</varname> everywhere. You can substitute
|
|
|
|
<varname>$HTTP_SESSION_VARS</varname> for
|
2002-10-03 07:54:36 +00:00
|
|
|
<varname>$_SESSION</varname>, if you prefer the former.
|
2002-07-28 14:04:32 +00:00
|
|
|
</para>
|
2002-10-04 03:05:09 +00:00
|
|
|
<para>
|
|
|
|
The keys in the <varname>$_SESSION</varname> 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
|
|
|
|
<link linkend='language.variables'>variables</link> in this manual.
|
|
|
|
</para>
|
2002-07-28 14:04:32 +00:00
|
|
|
</note>
|
|
|
|
|
|
|
|
<para>
|
|
|
|
If <link
|
|
|
|
linkend="ini.register-globals"><literal>register_globals</literal></link>
|
|
|
|
is disabled, only members of the global associative array
|
2002-10-03 07:54:36 +00:00
|
|
|
<varname>$_SESSION</varname> can be registered as session
|
2002-07-28 14:04:32 +00:00
|
|
|
variables. The restored session variables will only be available
|
2002-10-03 07:54:36 +00:00
|
|
|
in the array <varname>$_SESSION</varname>.
|
2002-07-28 14:04:32 +00:00
|
|
|
</para>
|
|
|
|
<para>
|
|
|
|
Use of <varname>$_SESSION</varname> (or
|
|
|
|
<varname>$HTTP_SESSION_VARS</varname> with PHP 4.0.6 or less) is
|
2002-10-03 07:54:36 +00:00
|
|
|
recommended for improved security and code readablity. With
|
2002-10-03 08:02:03 +00:00
|
|
|
<varname>$_SESSION</varname>, there is no need to use the
|
2002-10-07 11:12:19 +00:00
|
|
|
<function>session_register</function>,
|
|
|
|
<function>session_unregister</function>,
|
|
|
|
<function>session_is_registered</function> functions. Session variables
|
2002-10-03 08:02:03 +00:00
|
|
|
are accessible like any other variables.
|
2002-07-28 14:04:32 +00:00
|
|
|
<example>
|
|
|
|
<title>
|
|
|
|
Registering a variable with $_SESSION.
|
|
|
|
</title>
|
|
|
|
<programlisting role="php">
|
2002-04-15 00:12:54 +00:00
|
|
|
<![CDATA[
|
|
|
|
<?php
|
2002-04-19 16:49:59 +00:00
|
|
|
session_start();
|
2002-05-25 16:35:24 +00:00
|
|
|
// Use $HTTP_SESSION_VARS with PHP 4.0.6 or less
|
2002-04-15 00:12:54 +00:00
|
|
|
if (!isset($_SESSION['count'])) {
|
|
|
|
$_SESSION['count'] = 0;
|
|
|
|
} else {
|
|
|
|
$_SESSION['count']++;
|
|
|
|
}
|
|
|
|
?>
|
|
|
|
]]>
|
2002-07-28 14:04:32 +00:00
|
|
|
</programlisting>
|
|
|
|
</example>
|
|
|
|
<example>
|
|
|
|
<title>
|
2002-10-03 07:54:36 +00:00
|
|
|
Unregistering a variable with $_SESSION and register_globals disabled.
|
2002-07-28 14:04:32 +00:00
|
|
|
</title>
|
|
|
|
<programlisting role="php">
|
2002-04-15 00:12:54 +00:00
|
|
|
<![CDATA[
|
|
|
|
<?php
|
2002-04-19 16:49:59 +00:00
|
|
|
session_start();
|
2002-05-25 16:35:24 +00:00
|
|
|
// Use $HTTP_SESSION_VARS with PHP 4.0.6 or less
|
2002-04-15 00:12:54 +00:00
|
|
|
unset($_SESSION['count']);
|
|
|
|
?>
|
2002-10-03 07:54:36 +00:00
|
|
|
]]>
|
|
|
|
</programlisting>
|
|
|
|
</example>
|
|
|
|
<example>
|
|
|
|
<title>
|
|
|
|
Unregistering a variable with register_globals enabled, after
|
|
|
|
registering it using $_SESSION.
|
|
|
|
</title>
|
|
|
|
<programlisting role="php">
|
|
|
|
<![CDATA[
|
|
|
|
<?php
|
|
|
|
session_start();
|
2002-10-03 08:02:03 +00:00
|
|
|
// With PHP 4.3 and later, you can also simply use the prior example.
|
2002-10-03 07:54:36 +00:00
|
|
|
session_unregister('count');
|
|
|
|
?>
|
2002-04-15 00:12:54 +00:00
|
|
|
]]>
|
2002-07-28 14:04:32 +00:00
|
|
|
</programlisting>
|
|
|
|
</example>
|
|
|
|
</para>
|
|
|
|
<para>
|
|
|
|
If <link
|
|
|
|
linkend="ini.register-globals"><literal>register_globals</literal></link>
|
2002-10-03 08:02:03 +00:00
|
|
|
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
|
2002-10-07 11:12:19 +00:00
|
|
|
variables with <function>session_register</function> function.
|
|
|
|
You can avoid this by simply setting entries in
|
|
|
|
<varname>$_SESSION</varname>.
|
2002-07-28 14:04:32 +00:00
|
|
|
<caution>
|
|
|
|
<para>
|
|
|
|
If you are using
|
2002-10-03 07:54:36 +00:00
|
|
|
<varname>$_SESSION</varname>
|
2002-07-28 14:04:32 +00:00
|
|
|
and disable <link
|
2002-04-15 00:12:54 +00:00
|
|
|
linkend="ini.register-globals"><literal>register_globals</literal></link>,
|
2002-07-28 14:04:32 +00:00
|
|
|
do not use <function>session_register</function>,
|
|
|
|
<function>session_is_registered</function> and
|
2002-10-03 07:54:36 +00:00
|
|
|
<function>session_unregister</function>, if your scripts shall work
|
|
|
|
in PHP 4.2 and earlier. You can use these functions in 4.3 and later.
|
2002-07-28 14:04:32 +00:00
|
|
|
</para>
|
|
|
|
<para>
|
|
|
|
If you enable <link
|
|
|
|
linkend="ini.register-globals"><literal>register_globals</literal></link>,
|
|
|
|
<function>session_unregister</function> should be used since
|
|
|
|
session variables are registered as global variables when
|
|
|
|
session data is deserialized. Disabling <link
|
|
|
|
linkend="ini.register-globals"><literal>register_globals</literal></link>
|
2002-10-03 07:54:36 +00:00
|
|
|
is recommended for both security and performance reasons.
|
2002-07-28 14:04:32 +00:00
|
|
|
</para>
|
|
|
|
</caution>
|
|
|
|
<example>
|
|
|
|
<title>
|
|
|
|
Registering a variable with <link
|
2002-05-25 16:35:24 +00:00
|
|
|
linkend="ini.register-globals"><literal>register_globals</literal></link>
|
2002-07-28 14:04:32 +00:00
|
|
|
enabled
|
|
|
|
</title>
|
|
|
|
<programlisting role="php">
|
2002-04-15 00:12:54 +00:00
|
|
|
<![CDATA[
|
|
|
|
<?php
|
|
|
|
if (!session_is_registered('count')) {
|
|
|
|
session_register("count");
|
|
|
|
$count = 0;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$count++;
|
|
|
|
}
|
|
|
|
?>
|
|
|
|
]]>
|
2002-07-28 14:04:32 +00:00
|
|
|
</programlisting>
|
|
|
|
</example>
|
|
|
|
</para>
|
|
|
|
<para>
|
2002-10-03 07:54:36 +00:00
|
|
|
If <link
|
2002-07-28 14:04:32 +00:00
|
|
|
linkend="ini.register-globals"><literal>register_globals</literal></link>
|
2002-10-03 07:54:36 +00:00
|
|
|
is enabled, then the global variables and the
|
|
|
|
<varname>$_SESSION</varname> entries will automatically reference the
|
2002-12-17 10:17:29 +00:00
|
|
|
same values which were registered in the prior session instance.
|
2002-07-28 14:04:32 +00:00
|
|
|
</para>
|
|
|
|
<para>
|
2002-12-17 10:17:29 +00:00
|
|
|
There is a defect in PHP 4.2.3 and earlier. If you register a new
|
|
|
|
session variable by using <function>session_register</function>, the
|
|
|
|
entry in the global scope and the <varname>$_SESSION</varname> entry will
|
|
|
|
not reference the same value until the next
|
|
|
|
<function>session_start</function>. I.e. a modification to the newly
|
|
|
|
registered global variable will not be reflected by the
|
|
|
|
<varname>$_SESSION</varname> entry. This has been corrected in PHP 4.3.
|
2002-07-28 14:04:32 +00:00
|
|
|
</para>
|
|
|
|
</section>
|
|
|
|
|
|
|
|
<section id="session.idpassing">
|
|
|
|
<title>Passing the Session ID</title>
|
|
|
|
<para>
|
|
|
|
There are two methods to propagate a session id:
|
|
|
|
<itemizedlist>
|
|
|
|
<listitem>
|
|
|
|
<simpara>
|
|
|
|
Cookies
|
|
|
|
</simpara>
|
|
|
|
</listitem>
|
|
|
|
<listitem>
|
|
|
|
<simpara>
|
|
|
|
URL parameter
|
|
|
|
</simpara>
|
|
|
|
</listitem>
|
|
|
|
</itemizedlist>
|
|
|
|
</para>
|
|
|
|
<para>
|
|
|
|
The session module supports both methods. Cookies are optimal, but
|
2002-12-17 10:17:29 +00:00
|
|
|
because they are not always available, we also provide an alternative
|
|
|
|
way. The second method embeds the session id directly into URLs.
|
2002-07-28 14:04:32 +00:00
|
|
|
</para>
|
|
|
|
<para>
|
2002-12-17 10:17:29 +00:00
|
|
|
PHP is capable of transforming links transparently. Unless you are using
|
|
|
|
PHP 4.2 or later, you need to enable it manually when building PHP.
|
|
|
|
Under UNIX, pass <link linkend="install.configure.enable-trans-sid">
|
|
|
|
<literal>--enable-trans-sid</literal></link> to configure. If this build
|
|
|
|
option and the run-time option session.use_trans_sid are enabled,
|
|
|
|
relative URIs will be changed to contain the session id automatically.
|
2002-07-28 14:04:32 +00:00
|
|
|
<note>
|
|
|
|
<para>
|
2002-10-09 09:50:26 +00:00
|
|
|
The <link linkend="ini.arg-separator.output">arg_separator.output</link>
|
2002-12-17 10:17:29 +00:00
|
|
|
&php.ini; directive allows to customize the argument seperator. For full
|
|
|
|
XHTML conformance, specify &amp; there.
|
2002-07-28 14:04:32 +00:00
|
|
|
</para>
|
|
|
|
</note>
|
|
|
|
</para>
|
2002-12-17 10:17:29 +00:00
|
|
|
<para>
|
|
|
|
Alternatively, you can use the constant <literal>SID</literal> which is
|
|
|
|
always defined. If the client did not send an appropriate session
|
|
|
|
cookie, it has the form <literal>session_name=session_id</literal>.
|
|
|
|
Otherwise, it expands to an empty string. Thus, you can embed it
|
|
|
|
unconditionally into URLs.
|
|
|
|
</para>
|
2002-07-28 14:04:32 +00:00
|
|
|
<para>
|
|
|
|
The following example demonstrates how to register a variable, and
|
|
|
|
how to link correctly to another page using SID.
|
|
|
|
<example>
|
|
|
|
<title>Counting the number of hits of a single user</title>
|
|
|
|
<programlisting role="php">
|
2002-04-15 00:12:54 +00:00
|
|
|
<![CDATA[
|
|
|
|
<?php
|
|
|
|
if (!session_is_registered('count')) {
|
|
|
|
session_register('count');
|
|
|
|
$count = 1;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$count++;
|
|
|
|
}
|
|
|
|
?>
|
|
|
|
|
2002-10-10 12:00:02 +00:00
|
|
|
Hello visitor, you have seen this page <?php echo $count; ?> times.<p>
|
2002-04-15 00:12:54 +00:00
|
|
|
|
2002-05-25 16:35:24 +00:00
|
|
|
To continue, <A HREF="nextpage.php?<?php echo SID?>">click here</A>
|
2002-04-15 00:12:54 +00:00
|
|
|
]]>
|
2002-07-28 14:04:32 +00:00
|
|
|
</programlisting>
|
|
|
|
</example>
|
|
|
|
</para>
|
2002-04-15 00:12:54 +00:00
|
|
|
<para>
|
2002-10-10 12:00:02 +00:00
|
|
|
The <literal><?php echo SID?></literal>
|
|
|
|
(<literal><?=SID?></literal> can be used if
|
|
|
|
<link linkend="ini.short-open-tag">short_open_tag</link> is enabled) is
|
|
|
|
necessary to preserve the session id in the case that the user has
|
|
|
|
disabled cookies.
|
2002-07-28 14:04:32 +00:00
|
|
|
The <literal><?=SID?></literal> is not necessary, if
|
|
|
|
<link linkend="install.configure.enable-trans-sid">
|
|
|
|
<literal>--enable-trans-sid</literal></link> was used to compile PHP.
|
2002-04-15 00:12:54 +00:00
|
|
|
</para>
|
|
|
|
<note>
|
|
|
|
<para>
|
2002-07-28 14:04:32 +00:00
|
|
|
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.
|
2002-04-15 00:12:54 +00:00
|
|
|
</para>
|
|
|
|
</note>
|
2002-07-28 14:04:32 +00:00
|
|
|
</section>
|
|
|
|
|
|
|
|
<section id="session.customhandler">
|
|
|
|
<title>Custom Session Handlers</title>
|
|
|
|
<para>
|
|
|
|
To implement database storage, or any other storage method, you
|
|
|
|
will need to use <function>session_set_save_handler</function> to
|
|
|
|
create a set of user-level storage functions.
|
|
|
|
</para>
|
|
|
|
</section>
|
2002-04-15 00:12:54 +00:00
|
|
|
</partintro>
|
|
|
|
|
|
|
|
&reference.session.functions;
|
|
|
|
|
|
|
|
</reference>
|
|
|
|
|
|
|
|
<!-- Keep this comment at the end of the file
|
|
|
|
Local variables:
|
|
|
|
mode: sgml
|
|
|
|
sgml-omittag:t
|
|
|
|
sgml-shorttag:t
|
|
|
|
sgml-minimize-attributes:nil
|
|
|
|
sgml-always-quote-attributes:t
|
|
|
|
sgml-indent-step:1
|
|
|
|
sgml-indent-data:t
|
|
|
|
indent-tabs-mode:nil
|
|
|
|
sgml-parent-document:nil
|
|
|
|
sgml-default-dtd-file:"../../../manual.ced"
|
|
|
|
sgml-exposed-tags:nil
|
|
|
|
sgml-local-catalogs:nil
|
|
|
|
sgml-local-ecat-files:nil
|
|
|
|
End:
|
|
|
|
vim600: syn=xml fen fdm=syntax fdl=2 si
|
|
|
|
vim: et tw=78 syn=sgml
|
|
|
|
vi: ts=1 sw=1
|
|
|
|
-->
|
|
|
|
|