philip Wed Dec 25 05:32:01 2002 EDT Modified files: /phpdoc/en/features safe-mode.xml Log: WS ... \r\n -> \n
Index: phpdoc/en/features/safe-mode.xml diff -u phpdoc/en/features/safe-mode.xml:1.26 phpdoc/en/features/safe-mode.xml:1.27 --- phpdoc/en/features/safe-mode.xml:1.26 Sun Sep 29 20:09:43 2002 +++ phpdoc/en/features/safe-mode.xml Wed Dec 25 05:32:01 2002 @@ -1,561 +1,561 @@ -<?xml version="1.0" encoding="iso-8859-1"?> -<!-- $Revision: 1.26 $ --> - <chapter id="features.safe-mode"> - <title>Safe Mode</title> - - <para> - The PHP safe mode is an attempt to solve the shared-server security - problem. It is architecturally incorrect to try to solve this - problem at the PHP level, but since the alternatives at the web - server and OS levels aren't very realistic, many people, - especially ISP's, use safe mode for now. - </para> - - <sect1 id="ini.sect.safe-mode"> - <title>Security and Safe Mode</title> - <para> - <table> - <title>Security and Safe Mode Configuration Directives</title> - <tgroup cols="3"> - <thead> - <row> - <entry>Name</entry> - <entry>Default</entry> - <entry>Changeable</entry> - </row> - </thead> - <tbody> - <row> - <entry>safe_mode</entry> - <entry>"0"</entry> - <entry>PHP_INI_SYSTEM</entry> - </row> - <row> - <entry>safe_mode_gid</entry> - <entry>"0"</entry> - <entry>PHP_INI_SYSTEM</entry> - </row> - <row> - <entry>safe_mode_include_dir</entry> - <entry>NULL</entry> - <entry>PHP_INI_SYSTEM</entry> - </row> - <row> - <entry>safe_mode_exec_dir</entry> - <entry>""</entry> - <entry>PHP_INI_SYSTEM</entry> - </row> - <row> - <entry>safe_mode_allowed_env_vars</entry> - <entry>PHP_</entry> - <entry>PHP_INI_SYSTEM</entry> - </row> - <row> - <entry>safe_mode_protected_env_vars</entry> - <entry>LD_LIBRARY_PATH</entry> - <entry>PHP_INI_SYSTEM</entry> - </row> - <row> - <entry>open_basedir</entry> - <entry>NULL</entry> - <entry>PHP_INI_SYSTEM</entry> - </row> - <row> - <entry>disable_functions</entry> - <entry>""</entry> - <entry>PHP_INI_SYSTEM</entry> - </row> - </tbody> - </tgroup> - </table> - For further details and definition of the PHP_INI_* constants see - <function>ini_set</function>. +<?xml version="1.0" encoding="iso-8859-1"?> +<!-- $Revision: 1.27 $ --> + <chapter id="features.safe-mode"> + <title>Safe Mode</title> + + <para> + The PHP safe mode is an attempt to solve the shared-server security + problem. It is architecturally incorrect to try to solve this + problem at the PHP level, but since the alternatives at the web + server and OS levels aren't very realistic, many people, + especially ISP's, use safe mode for now. + </para> + + <sect1 id="ini.sect.safe-mode"> + <title>Security and Safe Mode</title> + <para> + <table> + <title>Security and Safe Mode Configuration Directives</title> + <tgroup cols="3"> + <thead> + <row> + <entry>Name</entry> + <entry>Default</entry> + <entry>Changeable</entry> + </row> + </thead> + <tbody> + <row> + <entry>safe_mode</entry> + <entry>"0"</entry> + <entry>PHP_INI_SYSTEM</entry> + </row> + <row> + <entry>safe_mode_gid</entry> + <entry>"0"</entry> + <entry>PHP_INI_SYSTEM</entry> + </row> + <row> + <entry>safe_mode_include_dir</entry> + <entry>NULL</entry> + <entry>PHP_INI_SYSTEM</entry> + </row> + <row> + <entry>safe_mode_exec_dir</entry> + <entry>""</entry> + <entry>PHP_INI_SYSTEM</entry> + </row> + <row> + <entry>safe_mode_allowed_env_vars</entry> + <entry>PHP_</entry> + <entry>PHP_INI_SYSTEM</entry> + </row> + <row> + <entry>safe_mode_protected_env_vars</entry> + <entry>LD_LIBRARY_PATH</entry> + <entry>PHP_INI_SYSTEM</entry> + </row> + <row> + <entry>open_basedir</entry> + <entry>NULL</entry> + <entry>PHP_INI_SYSTEM</entry> + </row> + <row> + <entry>disable_functions</entry> + <entry>""</entry> + <entry>PHP_INI_SYSTEM</entry> + </row> + </tbody> + </tgroup> + </table> + For further details and definition of the PHP_INI_* constants see + <function>ini_set</function>. </para> - <para> - Here is a short explanation of the configuration directives. - <variablelist> - <varlistentry id="ini.safe-mode"> - <term> - <parameter>safe_mode</parameter> - <type>boolean</type> - </term> - <listitem> - <para> - Whether to enable PHP's safe mode. Read the - <link linkend="security">Security</link> and chapter for more - information. - </para> - </listitem> - </varlistentry> - <varlistentry id="ini.safe-mode-gid"> - <term> - <parameter>safe_mode_gid</parameter> - <type>boolean</type> - </term> - <listitem> - <para> - By default, Safe Mode does a UID compare check when - opening files. If you want to relax this to a GID compare, - then turn on safe_mode_gid. - Whether to use <literal>UID</literal> (&false;) or - <literal>GID</literal> (&true;) checking upon file - access. - </para> - </listitem> - </varlistentry> - <varlistentry id="ini.safe-mode-include-dir"> - <term> - <parameter>safe_mode_include_dir</parameter> - <type>string</type> - </term> - <listitem> - <para> - <literal>UID</literal>/<literal>GID</literal> checks are bypassed when - including files from this directory and its subdirectories (directory - must also be in <link linkend="ini.include-path">include_path</link> - or full path must including). - </para> - <simpara> - As of PHP 4.2.0, this directive can take a semi-colon separated - path in a similar fashion to the - <link linkend="ini.include-path">include_path</link> directive, - rather than just a single directory. - </simpara> - </listitem> - </varlistentry> - <varlistentry id="ini.safe-mode-exec-dir"> - <term> - <parameter>safe_mode_exec_dir</parameter> - <type>string</type> - </term> - <listitem> - <para> - If PHP is used in safe mode, <function>system</function> and the other - <link linkend="ref.exec">functions executing system programs</link> - refuse to start programs that are not in this directory. - </para> - </listitem> - </varlistentry> - <varlistentry id="ini.safe-mode-allowed-env-vars"> - <term> - <parameter>safe_mode_allowed_env_vars</parameter> - <type>string</type> - </term> - <listitem> - <para> - Setting certain environment variables may be a potential security breach. - This directive contains a comma-delimited list of prefixes. In Safe Mode, - the user may only alter environment variables whose names begin with the - prefixes supplied here. By default, users will only be able to set - environment variables that begin with PHP_ (e.g. PHP_FOO=BAR). - </para> - <note> - <para> - If this directive is empty, PHP will let the user modify ANY - environment variable! - </para> - </note> - </listitem> - </varlistentry> - <varlistentry id="ini.safe-mode-protected-env-vars"> - <term> - <parameter>safe_mode_protected_env_vars</parameter> - <type>string</type> - </term> - <listitem> - <para> - This directive contains a comma-delimited list of environment - variables that the end user won't be able to change using - <function>putenv</function>. These variables will be protected - even if safe_mode_allowed_env_vars is set to allow to change them. - </para> - </listitem> - </varlistentry> - <varlistentry id="ini.open-basedir"> - <term> - <parameter>open_basedir</parameter> - <type>string</type> - </term> - <listitem> - <para> - Limit the files that can be opened by PHP to the specified - directory-tree. This directive is <emphasis>NOT</emphasis> - affected by whether Safe Mode is turned On or Off. - </para> - <para> - When a script tries to open a file with, - for example, fopen or gzopen, the location of the file is - checked. When the file is outside the specified directory-tree, - PHP will refuse to open it. All symbolic links are resolved, - so it's not possible to avoid this restriction with a symlink. - </para> - <para> - The special value <systemitem class="constant">.</systemitem> - indicates that the directory in which the script is stored will - be used as base-directory. - </para> - <para> - Under Windows, separate the directories with a semicolon. On all - other systems, separate the directories with a colon. As an Apache - module, open_basedir paths from parent directories are now - automatically inherited. - </para> - <para> - The restriction specified with open_basedir is actually a - prefix, not a directory name. This means that "open_basedir = - /dir/incl" also allows access to "/dir/include" and - "/dir/incls" if they exist. When you want to restrict access - to only the specified directory, end with a slash. For example: - "open_basedir = /dir/incl/" - </para> - <note> - <para> - Support for multiple directories was added in 3.0.7. - </para> - </note> - <para> - The default is to allow all files to be opened. - </para> - </listitem> - </varlistentry> - <varlistentry id="ini.disable-functions"> - <term> - <parameter>disable_functions</parameter> - <type>string</type> - </term> - <listitem> - <simpara> - This directive allows you to disable certain functions for - <link linkend="security">security</link> reasons. It takes - on a comma-dilimited list of function names. disable_functions - is not affected by <link linkend="ini.safe-mode">Safe Mode</link>. - </simpara> - <simpara> - This directive must be set in &php.ini; For example, you - cannot set this in <filename>httpd.conf</filename>. - </simpara> - </listitem> - </varlistentry> - </variablelist> - </para> - <para> - See also: <link linkend="ini.register-globals">register_globals</link>, - <link linkend="ini.display-errors">display_errors</link>, and - <link linkend="ini.log-errors">log_errors</link> - </para> - - <para> - When <link linkend="ini.safe-mode">safe_mode</link> is on, PHP checks to see - if the owner of the current script matches the owner of the file to be - operated on by a file function. For example: - <programlisting role="ls"> -<![CDATA[ --rw-rw-r-- 1 rasmus rasmus 33 Jul 1 19:20 script.php --rw-r--r-- 1 root root 1116 May 26 18:01 /etc/passwd -]]> - </programlisting> - Running this script.php - <programlisting role="php"> -<![CDATA[ -<?php - readfile('/etc/passwd'); -?> -]]> - </programlisting> - results in this error when safe mode is enabled: - <screen> -<![CDATA[ -Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not -allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2 -]]> - </screen> - </para> - <para> - However, there may be environments where a strict <literal>UID</literal> - check is not appropriate and a relaxed <literal>GID</literal> check is - sufficient. This is supported by means of the <link - linkend="ini.safe-mode-gid">safe_mode_gid</link> switch. Setting it to - <literal>On</literal> performs the relaxed <literal>GID</literal> checking, - setting it to <literal>Off</literal> (the default) performs - <literal>UID</literal> checking. - </para> - <para> - If instead of <link linkend="ini.safe-mode">safe_mode</link>, you set an - <link linkend="ini.open-basedir">open_basedir</link> directory then all - file operations will be limited to files under the specified directory - For example (Apache httpd.conf example): - <programlisting role="ini"> -<![CDATA[ -<Directory /docroot> - php_admin_value open_basedir /docroot -</Directory> -]]> - </programlisting> - If you run the same script.php with this - <link linkend="ini.open-basedir">open_basedir</link> setting - then this is the result: - <screen> -<![CDATA[ -Warning: open_basedir restriction in effect. File is in wrong directory in -/docroot/script.php on line 2 -]]> - </screen> - </para> - <para> - You can also disable individual functions. Note that the disable_functions - directive can not be used outside of the &php.ini; file which means that - you cannot disable functions on a per-virtualhost or per-directory basis - in your httpd.conf file. - If we add this to our &php.ini; file: - <programlisting role="ini"> -<![CDATA[ -disable_functions readfile,system -]]> - </programlisting> - Then we get this output: - <screen> -<![CDATA[ -Warning: readfile() has been disabled for security reasons in -/docroot/script.php on line 2 -]]> - </screen> - </para> - </sect1> - - <sect1 id="features.safe-mode.functions"> - <title>Functions restricted/disabled by safe mode</title> - <para> - This is a still probably incomplete and possibly incorrect listing - of the functions limited by - <link linkend="features.safe-mode">safe mode</link>. - <!-- TODO: add ¬e.sm.*; to the functions mentioned here. - That entity should link to this section --> - <table> - <title>Safe mode limited functions</title> - <tgroup cols="2"> - <thead> - <row> - <entry>Function</entry> - <entry>Limitations</entry> - </row> - </thead> - <tbody> - <row> - <entry><function>dbmopen</function></entry> - <entry>&sm.uidcheck;</entry> - </row> - <row> - <entry><function>dbase_open</function></entry> - <entry>&sm.uidcheck;</entry> - </row> - <row> - <entry><function>filepro</function></entry> - <entry>&sm.uidcheck;</entry> - </row> - <row> - <entry><function>filepro_rowcount</function></entry> - <entry>&sm.uidcheck;</entry> - </row> - <row> - <entry><function>filepro_retrieve</function></entry> - <entry>&sm.uidcheck;</entry> - </row> - <row> - <entry><function>ifx_*</function></entry> - <entry>sql_safe_mode restrictions, (!= safe mode)</entry> - <!-- TODO: more info on sql-safe-mode --> - </row> - <row> - <entry><function>ingres_*</function></entry> - <entry>sql_safe_mode restrictions, (!= safe mode)</entry> - <!-- TODO: more info on sql-safe-mode --> - </row> - <row> - <entry><function>mysql_*</function></entry> - <entry>sql_safe_mode restrictions, (!= safe mode)</entry> - <!-- TODO: more info on sql-safe-mode --> - </row> - <row> - <entry><function>pg_loimport</function></entry> - <entry>&sm.uidcheck;</entry> - <!-- source TODO: there is no PHP-warning for that safe-mode-restriction --> - </row> - <row> - <entry><function>posix_mkfifo</function></entry> - <entry>&sm.uidcheck.dir;</entry> - </row> - <row> - <entry><function>putenv</function></entry> - <entry>Obeys the safe_mode_protected_env_vars and - safe_mode_allowed_env_vars ini-directives. See also the documentation - on <function>putenv</function></entry> - <!-- TODO: document those directives in chapters/config.xml --> - </row> - <row> - <entry><function>move_uploaded_file</function></entry> - <entry>&sm.uidcheck; <!-- TODO: check this --></entry> - </row> - - <!-- TODO: from here on, add warning to the function itself --> - - <row> - <entry><function>chdir</function></entry> - <entry>&sm.uidcheck.dir;</entry> - </row> - <row> - <entry><function>dl</function></entry> - <entry>&sm.disabled;</entry> - </row> - <row> - <entry><link linkend="language.operators.execution">backtick operator</link></entry> - <entry>&sm.disabled;</entry> - </row> - <row> - <entry><function>shell_exec</function> (functional equivalent - of backticks)</entry> - <entry>&sm.disabled;</entry> - </row> - <row> - <entry><function>exec</function></entry> - <entry>You can only execute executables within the <link - linkend="ini.safe-mode-exec-dir">safe_mode_exec_dir</link>. - For practical reasons it's currently not allowed to have - <literal>..</literal> components in the path to the executable.</entry> - </row> - <row> - <entry><function>system</function></entry> - <entry>You can only execute executables within the <link - linkend="ini.safe-mode-exec-dir">safe_mode_exec_dir</link>. - For practical reasons it's currently not allowed to have - <literal>..</literal> components in the path to the executable.</entry> - </row> - <row> - <entry><function>passthru</function></entry> - <entry>You can only execute executables within the <link - linkend="ini.safe-mode-exec-dir">safe_mode_exec_dir</link>. - For practical reasons it's currently not allowed to have - <literal>..</literal> components in the path to the executable.</entry> - </row> - <row> - <entry><function>popen</function></entry> - <entry>You can only execute executables within the <link - linkend="ini.safe-mode-exec-dir">safe_mode_exec_dir</link>. - For practical reasons it's currently not allowed to have - <literal>..</literal> components in the path to the executable.</entry> - <!-- TODO: not sure. popen uses a completely different implementation - Don't know why, don't know whether it's behaving the same --> - </row> - <row> - <entry><function>mkdir</function></entry> - <entry>&sm.uidcheck.dir;</entry> - </row> - <row> - <entry><function>rmdir</function></entry> - <entry>&sm.uidcheck;</entry> - </row> - <row> - <entry><function>rename</function></entry> - <entry>&sm.uidcheck; &sm.uidcheck.dir;<!-- on the old name only, it seems. Is rename preventing moving files? --></entry> - </row> - <row> - <entry><function>unlink</function></entry> - <entry>&sm.uidcheck; &sm.uidcheck.dir;</entry> - </row> - <row> - <entry><function>copy</function></entry> - <entry>&sm.uidcheck; &sm.uidcheck.dir; (on - <parameter>source</parameter> and - <parameter>target</parameter>) </entry> - </row> - <row> - <entry><function>chgrp</function></entry> - <entry>&sm.uidcheck;</entry> - </row> - <row> - <entry><function>chown</function></entry> - <entry>&sm.uidcheck;</entry> - </row> - <row> - <entry><function>chmod</function></entry> - <entry>&sm.uidcheck; In addition, you cannot - set the SUID, SGID and sticky bits</entry> - </row> - <row> - <entry><function>touch</function></entry> - <entry>&sm.uidcheck; &sm.uidcheck.dir;</entry> - </row> - <row> - <entry><function>symlink</function></entry> - <entry>&sm.uidcheck; &sm.uidcheck.dir; (note: only the target is - checked)</entry> - </row> - <row> - <entry><function>link</function></entry> - <entry>&sm.uidcheck; &sm.uidcheck.dir; (note: only the target is - checked)</entry> - </row> - <row> - <entry><function>getallheaders</function></entry> - <entry>In safe mode, headers beginning with 'authorization' - (case-insensitive) - will not be returned. Warning: this is broken with the aol-server - implementation of <function>getallheaders</function>!</entry> - </row> - <row> - <entry><function>header</function></entry> - <entry>In safe mode, the uid of the script is added to the - <literal>realm</literal> part of the - <literal>WWW-Authenticate</literal> header if you set this - header (used for HTTP Authentication).</entry> - </row> - <row> - <entry> - <function>highlight_file</function>, - <function>show_source</function> - </entry> - <entry> - &sm.uidcheck; &sm.uidcheck.dir; (note: only affected since PHP 4.2.1) - </entry> - </row> - <row> - <entry> - <function>parse_ini_file</function> - </entry> - <entry> - &sm.uidcheck; &sm.uidcheck.dir; (note: only affected since PHP 4.2.1) - </entry> - </row> - <row> - <entry>Any function that uses - <filename>php4/main/fopen_wrappers.c</filename> - </entry> - <entry>??</entry> - </row> - </tbody> - </tgroup> - </table> - </para> - </sect1> - - </chapter> - -<!-- 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 ---> + <para> + Here is a short explanation of the configuration directives. + <variablelist> + <varlistentry id="ini.safe-mode"> + <term> + <parameter>safe_mode</parameter> + <type>boolean</type> + </term> + <listitem> + <para> + Whether to enable PHP's safe mode. Read the + <link linkend="security">Security</link> and chapter for more + information. + </para> + </listitem> + </varlistentry> + <varlistentry id="ini.safe-mode-gid"> + <term> + <parameter>safe_mode_gid</parameter> + <type>boolean</type> + </term> + <listitem> + <para> + By default, Safe Mode does a UID compare check when + opening files. If you want to relax this to a GID compare, + then turn on safe_mode_gid. + Whether to use <literal>UID</literal> (&false;) or + <literal>GID</literal> (&true;) checking upon file + access. + </para> + </listitem> + </varlistentry> + <varlistentry id="ini.safe-mode-include-dir"> + <term> + <parameter>safe_mode_include_dir</parameter> + <type>string</type> + </term> + <listitem> + <para> + <literal>UID</literal>/<literal>GID</literal> checks are bypassed when + including files from this directory and its subdirectories (directory + must also be in <link linkend="ini.include-path">include_path</link> + or full path must including). + </para> + <simpara> + As of PHP 4.2.0, this directive can take a semi-colon separated + path in a similar fashion to the + <link linkend="ini.include-path">include_path</link> directive, + rather than just a single directory. + </simpara> + </listitem> + </varlistentry> + <varlistentry id="ini.safe-mode-exec-dir"> + <term> + <parameter>safe_mode_exec_dir</parameter> + <type>string</type> + </term> + <listitem> + <para> + If PHP is used in safe mode, <function>system</function> and the other + <link linkend="ref.exec">functions executing system programs</link> + refuse to start programs that are not in this directory. + </para> + </listitem> + </varlistentry> + <varlistentry id="ini.safe-mode-allowed-env-vars"> + <term> + <parameter>safe_mode_allowed_env_vars</parameter> + <type>string</type> + </term> + <listitem> + <para> + Setting certain environment variables may be a potential security breach. + This directive contains a comma-delimited list of prefixes. In Safe Mode, + the user may only alter environment variables whose names begin with the + prefixes supplied here. By default, users will only be able to set + environment variables that begin with PHP_ (e.g. PHP_FOO=BAR). + </para> + <note> + <para> + If this directive is empty, PHP will let the user modify ANY + environment variable! + </para> + </note> + </listitem> + </varlistentry> + <varlistentry id="ini.safe-mode-protected-env-vars"> + <term> + <parameter>safe_mode_protected_env_vars</parameter> + <type>string</type> + </term> + <listitem> + <para> + This directive contains a comma-delimited list of environment + variables that the end user won't be able to change using + <function>putenv</function>. These variables will be protected + even if safe_mode_allowed_env_vars is set to allow to change them. + </para> + </listitem> + </varlistentry> + <varlistentry id="ini.open-basedir"> + <term> + <parameter>open_basedir</parameter> + <type>string</type> + </term> + <listitem> + <para> + Limit the files that can be opened by PHP to the specified + directory-tree. This directive is <emphasis>NOT</emphasis> + affected by whether Safe Mode is turned On or Off. + </para> + <para> + When a script tries to open a file with, + for example, fopen or gzopen, the location of the file is + checked. When the file is outside the specified directory-tree, + PHP will refuse to open it. All symbolic links are resolved, + so it's not possible to avoid this restriction with a symlink. + </para> + <para> + The special value <systemitem class="constant">.</systemitem> + indicates that the directory in which the script is stored will + be used as base-directory. + </para> + <para> + Under Windows, separate the directories with a semicolon. On all + other systems, separate the directories with a colon. As an Apache + module, open_basedir paths from parent directories are now + automatically inherited. + </para> + <para> + The restriction specified with open_basedir is actually a + prefix, not a directory name. This means that "open_basedir = + /dir/incl" also allows access to "/dir/include" and + "/dir/incls" if they exist. When you want to restrict access + to only the specified directory, end with a slash. For example: + "open_basedir = /dir/incl/" + </para> + <note> + <para> + Support for multiple directories was added in 3.0.7. + </para> + </note> + <para> + The default is to allow all files to be opened. + </para> + </listitem> + </varlistentry> + <varlistentry id="ini.disable-functions"> + <term> + <parameter>disable_functions</parameter> + <type>string</type> + </term> + <listitem> + <simpara> + This directive allows you to disable certain functions for + <link linkend="security">security</link> reasons. It takes + on a comma-dilimited list of function names. disable_functions + is not affected by <link linkend="ini.safe-mode">Safe Mode</link>. + </simpara> + <simpara> + This directive must be set in &php.ini; For example, you + cannot set this in <filename>httpd.conf</filename>. + </simpara> + </listitem> + </varlistentry> + </variablelist> + </para> + <para> + See also: <link linkend="ini.register-globals">register_globals</link>, + <link linkend="ini.display-errors">display_errors</link>, and + <link linkend="ini.log-errors">log_errors</link> + </para> + + <para> + When <link linkend="ini.safe-mode">safe_mode</link> is on, PHP checks to see + if the owner of the current script matches the owner of the file to be + operated on by a file function. For example: + <programlisting role="ls"> +<![CDATA[ +-rw-rw-r-- 1 rasmus rasmus 33 Jul 1 19:20 script.php +-rw-r--r-- 1 root root 1116 May 26 18:01 /etc/passwd +]]> + </programlisting> + Running this script.php + <programlisting role="php"> +<![CDATA[ +<?php + readfile('/etc/passwd'); +?> +]]> + </programlisting> + results in this error when safe mode is enabled: + <screen> +<![CDATA[ +Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not +allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2 +]]> + </screen> + </para> + <para> + However, there may be environments where a strict <literal>UID</literal> + check is not appropriate and a relaxed <literal>GID</literal> check is + sufficient. This is supported by means of the <link + linkend="ini.safe-mode-gid">safe_mode_gid</link> switch. Setting it to + <literal>On</literal> performs the relaxed <literal>GID</literal> checking, + setting it to <literal>Off</literal> (the default) performs + <literal>UID</literal> checking. + </para> + <para> + If instead of <link linkend="ini.safe-mode">safe_mode</link>, you set an + <link linkend="ini.open-basedir">open_basedir</link> directory then all + file operations will be limited to files under the specified directory + For example (Apache httpd.conf example): + <programlisting role="ini"> +<![CDATA[ +<Directory /docroot> + php_admin_value open_basedir /docroot +</Directory> +]]> + </programlisting> + If you run the same script.php with this + <link linkend="ini.open-basedir">open_basedir</link> setting + then this is the result: + <screen> +<![CDATA[ +Warning: open_basedir restriction in effect. File is in wrong directory in +/docroot/script.php on line 2 +]]> + </screen> + </para> + <para> + You can also disable individual functions. Note that the disable_functions + directive can not be used outside of the &php.ini; file which means that + you cannot disable functions on a per-virtualhost or per-directory basis + in your httpd.conf file. + If we add this to our &php.ini; file: + <programlisting role="ini"> +<![CDATA[ +disable_functions readfile,system +]]> + </programlisting> + Then we get this output: + <screen> +<![CDATA[ +Warning: readfile() has been disabled for security reasons in +/docroot/script.php on line 2 +]]> + </screen> + </para> + </sect1> + + <sect1 id="features.safe-mode.functions"> + <title>Functions restricted/disabled by safe mode</title> + <para> + This is a still probably incomplete and possibly incorrect listing + of the functions limited by + <link linkend="features.safe-mode">safe mode</link>. + <!-- TODO: add ¬e.sm.*; to the functions mentioned here. + That entity should link to this section --> + <table> + <title>Safe mode limited functions</title> + <tgroup cols="2"> + <thead> + <row> + <entry>Function</entry> + <entry>Limitations</entry> + </row> + </thead> + <tbody> + <row> + <entry><function>dbmopen</function></entry> + <entry>&sm.uidcheck;</entry> + </row> + <row> + <entry><function>dbase_open</function></entry> + <entry>&sm.uidcheck;</entry> + </row> + <row> + <entry><function>filepro</function></entry> + <entry>&sm.uidcheck;</entry> + </row> + <row> + <entry><function>filepro_rowcount</function></entry> + <entry>&sm.uidcheck;</entry> + </row> + <row> + <entry><function>filepro_retrieve</function></entry> + <entry>&sm.uidcheck;</entry> + </row> + <row> + <entry><function>ifx_*</function></entry> + <entry>sql_safe_mode restrictions, (!= safe mode)</entry> + <!-- TODO: more info on sql-safe-mode --> + </row> + <row> + <entry><function>ingres_*</function></entry> + <entry>sql_safe_mode restrictions, (!= safe mode)</entry> + <!-- TODO: more info on sql-safe-mode --> + </row> + <row> + <entry><function>mysql_*</function></entry> + <entry>sql_safe_mode restrictions, (!= safe mode)</entry> + <!-- TODO: more info on sql-safe-mode --> + </row> + <row> + <entry><function>pg_loimport</function></entry> + <entry>&sm.uidcheck;</entry> + <!-- source TODO: there is no PHP-warning for that safe-mode-restriction --> + </row> + <row> + <entry><function>posix_mkfifo</function></entry> + <entry>&sm.uidcheck.dir;</entry> + </row> + <row> + <entry><function>putenv</function></entry> + <entry>Obeys the safe_mode_protected_env_vars and + safe_mode_allowed_env_vars ini-directives. See also the documentation + on <function>putenv</function></entry> + <!-- TODO: document those directives in chapters/config.xml --> + </row> + <row> + <entry><function>move_uploaded_file</function></entry> + <entry>&sm.uidcheck; <!-- TODO: check this --></entry> + </row> + + <!-- TODO: from here on, add warning to the function itself --> + + <row> + <entry><function>chdir</function></entry> + <entry>&sm.uidcheck.dir;</entry> + </row> + <row> + <entry><function>dl</function></entry> + <entry>&sm.disabled;</entry> + </row> + <row> + <entry><link linkend="language.operators.execution">backtick +operator</link></entry> + <entry>&sm.disabled;</entry> + </row> + <row> + <entry><function>shell_exec</function> (functional equivalent + of backticks)</entry> + <entry>&sm.disabled;</entry> + </row> + <row> + <entry><function>exec</function></entry> + <entry>You can only execute executables within the <link + linkend="ini.safe-mode-exec-dir">safe_mode_exec_dir</link>. + For practical reasons it's currently not allowed to have + <literal>..</literal> components in the path to the executable.</entry> + </row> + <row> + <entry><function>system</function></entry> + <entry>You can only execute executables within the <link + linkend="ini.safe-mode-exec-dir">safe_mode_exec_dir</link>. + For practical reasons it's currently not allowed to have + <literal>..</literal> components in the path to the executable.</entry> + </row> + <row> + <entry><function>passthru</function></entry> + <entry>You can only execute executables within the <link + linkend="ini.safe-mode-exec-dir">safe_mode_exec_dir</link>. + For practical reasons it's currently not allowed to have + <literal>..</literal> components in the path to the executable.</entry> + </row> + <row> + <entry><function>popen</function></entry> + <entry>You can only execute executables within the <link + linkend="ini.safe-mode-exec-dir">safe_mode_exec_dir</link>. + For practical reasons it's currently not allowed to have + <literal>..</literal> components in the path to the executable.</entry> + <!-- TODO: not sure. popen uses a completely different implementation + Don't know why, don't know whether it's behaving the same --> + </row> + <row> + <entry><function>mkdir</function></entry> + <entry>&sm.uidcheck.dir;</entry> + </row> + <row> + <entry><function>rmdir</function></entry> + <entry>&sm.uidcheck;</entry> + </row> + <row> + <entry><function>rename</function></entry> + <entry>&sm.uidcheck; &sm.uidcheck.dir;<!-- on the old name only, it seems. Is +rename preventing moving files? --></entry> + </row> + <row> + <entry><function>unlink</function></entry> + <entry>&sm.uidcheck; &sm.uidcheck.dir;</entry> + </row> + <row> + <entry><function>copy</function></entry> + <entry>&sm.uidcheck; &sm.uidcheck.dir; (on + <parameter>source</parameter> and + <parameter>target</parameter>) </entry> + </row> + <row> + <entry><function>chgrp</function></entry> + <entry>&sm.uidcheck;</entry> + </row> + <row> + <entry><function>chown</function></entry> + <entry>&sm.uidcheck;</entry> + </row> + <row> + <entry><function>chmod</function></entry> + <entry>&sm.uidcheck; In addition, you cannot + set the SUID, SGID and sticky bits</entry> + </row> + <row> + <entry><function>touch</function></entry> + <entry>&sm.uidcheck; &sm.uidcheck.dir;</entry> + </row> + <row> + <entry><function>symlink</function></entry> + <entry>&sm.uidcheck; &sm.uidcheck.dir; (note: only the target is + checked)</entry> + </row> + <row> + <entry><function>link</function></entry> + <entry>&sm.uidcheck; &sm.uidcheck.dir; (note: only the target is + checked)</entry> + </row> + <row> + <entry><function>getallheaders</function></entry> + <entry>In safe mode, headers beginning with 'authorization' + (case-insensitive) + will not be returned. Warning: this is broken with the aol-server + implementation of <function>getallheaders</function>!</entry> + </row> + <row> + <entry><function>header</function></entry> + <entry>In safe mode, the uid of the script is added to the + <literal>realm</literal> part of the + <literal>WWW-Authenticate</literal> header if you set this + header (used for HTTP Authentication).</entry> + </row> + <row> + <entry> + <function>highlight_file</function>, + <function>show_source</function> + </entry> + <entry> + &sm.uidcheck; &sm.uidcheck.dir; (note: only affected since PHP 4.2.1) + </entry> + </row> + <row> + <entry> + <function>parse_ini_file</function> + </entry> + <entry> + &sm.uidcheck; &sm.uidcheck.dir; (note: only affected since PHP 4.2.1) + </entry> + </row> + <row> + <entry>Any function that uses + <filename>php4/main/fopen_wrappers.c</filename> + </entry> + <entry>??</entry> + </row> + </tbody> + </tgroup> + </table> + </para> + </sect1> + + </chapter> + +<!-- 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 +-->
-- PHP Documentation Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php