cvs: phpdoc-ca /features safe-mode.xml

From: Date: Tue, 30 Aug 2005 18:47:25 +0000
Subject: cvs: phpdoc-ca /features safe-mode.xml
Groups: php.doc.ca 
Request: Send a blank email to doc-ca+get-72@lists.php.net to get a copy of this message
eduardcapell Tue Aug 30 14:47:25 2005 EDT Added files: /phpdoc-ca/features safe-mode.xml Log:

http://cvs.php.net/co.php/phpdoc-ca/features/safe-mode.xml?r=1.1&p=1 Index: phpdoc-ca/features/safe-mode.xml +++ phpdoc-ca/features/safe-mode.xml <?xml version="1.0" encoding="iso-8859-1"?> <!-- $Revision: 1.1 $ --> <!-- EN-Revision: 1.63 Maintainer: eduardcapell Status: ready --> <chapter id="features.safe-mode"> <title>Mode Segur</title> <para> El mode segur de PHP és un intent de resoldre el problema de seguretat d'un servidor compartit. Arquitecturalment parlant, no és correcte de resoldre aquest problema al nivell del PHP, però com que les alternatives al nivell del servidor web o del sistema operatiu no són gaire realistes, molta gent, especialment ISPs, utilitzen el mode segur per ara. </para> <sect1 id="ini.sect.safe-mode"> <title>Seguretat i Mode Segur</title> <para> <table> <title>Directives de Configuració de Seguretat i Mode Segur</title> <tgroup cols="4"> <thead> <row> <entry>Nom</entry> <entry>Valor per Defecte</entry> <entry>Modificable</entry> <entry>Historial</entry> </row> </thead> <tbody> <row> <entry>safe_mode</entry> <entry>"0"</entry> <entry>PHP_INI_SYSTEM</entry> <entry></entry> </row> <row> <entry>safe_mode_gid</entry> <entry>"0"</entry> <entry>PHP_INI_SYSTEM</entry> <entry>Disponible des de PHP 4.1.0.</entry> </row> <row> <entry>safe_mode_include_dir</entry> <entry>NULL</entry> <entry>PHP_INI_SYSTEM</entry> <entry>Disponible des de PHP 4.1.0.</entry> </row> <row> <entry>safe_mode_exec_dir</entry> <entry>""</entry> <entry>PHP_INI_SYSTEM</entry> <entry></entry> </row> <row> <entry>safe_mode_allowed_env_vars</entry> <entry>"PHP_"</entry> <entry>PHP_INI_SYSTEM</entry> <entry></entry> </row> <row> <entry>safe_mode_protected_env_vars</entry> <entry>"LD_LIBRARY_PATH"</entry> <entry>PHP_INI_SYSTEM</entry> <entry></entry> </row> <row> <entry>open_basedir</entry> <entry>NULL</entry> <entry>PHP_INI_SYSTEM</entry> <entry></entry> </row> <row> <entry>disable_functions</entry> <entry>""</entry> <entry>només &php.ini;</entry> <entry>Disponible des de PHP 4.0.1.</entry> </row> <row> <entry>disable_classes</entry> <entry>""</entry> <entry>només &php.ini;</entry> <entry>Disponible des de PHP 4.3.2.</entry> </row> </tbody> </tgroup> </table> Per més detalls i definició de les constants PHP_INI_*, vegeu <function>ini_set</function>. </para> &ini.descriptions.title; <para> <variablelist> <varlistentry id="ini.safe-mode"> <term> <parameter>safe_mode</parameter> <type>booleà</type> </term> <listitem> <para> Per activar el mode segur de PHP. Llegiu-vos el capítol sobre <link linkend="security">Seguretat</link> per més informació. </para> </listitem> </varlistentry> <varlistentry id="ini.safe-mode-gid"> <term> <parameter>safe_mode_gid</parameter> <type>booleà</type> </term> <listitem> <para> Per defecte, el Mode Segur fa una comprovació de comparació de l'UID quan obre un fitxer. Si voleu relaxar aquesta restricció a una comparació de GID, activeu safe_mode_gid. Serveix per utilitzar la comprovació de <literal>UID</literal> (&false;) o <literal>GID</literal> (&true;) en els accessos a fitxers. </para> </listitem> </varlistentry> <varlistentry id="ini.safe-mode-include-dir"> <term> <parameter>safe_mode_include_dir</parameter> <type>cadena</type> </term> <listitem> <para> Les comprovacions <literal>UID</literal>/<literal>GID</literal> no s'activaran quan s'incloguin fitxers d'aquesta carpeta i les seves subcarpetes (la carpeta ha de ser a <link linkend="ini.include-path">include_path</link> o, en cas contrari, caldrà especificar la ruta complerta en incloure els fitxers). </para> <simpara> Des de PHP 4.2.0, aquesta directiva pot utilitzar dos punts (punt i coma en Windows) per a separar rutes de la mateixa manera que es fa en la directiva <link linkend="ini.include-path">include_path</link>, per tal d'indicar una ruta múltiple. </simpara> <simpara> La restricció especificada és de fet un prefix, no pas un nom de directori. Això vol dir que "safe_mode_include_dir = /dir/incl" també permet l'accés a "/dir/include" and "/dir/incls" si és que existeixen. Si voleu restringir l'accés de forma exclusiva al directori indicat, acabeu la cadena de text de la ruta amb una barra. Per exemple: "safe_mode_include_dir = /dir/incl/" </simpara> <simpara> Si el valor d'aquesta directiva és buit, no és possible d'incloure fitxers amb diferents <literal>UID</literal>/<literal>GID</literal> des de PHP 4.2.3 i PHP 4.3.3. En versions anteriors, es podien incloure tots els fitxers. </simpara> </listitem> </varlistentry> <varlistentry id="ini.safe-mode-exec-dir"> <term> <parameter>safe_mode_exec_dir</parameter> <type>cadena</type> </term> <listitem> <para> Si el PHP s'utilitza en mode segur, la funció <function>system</function> i la resta de <link linkend="ref.exec">funcions que executen programes del sistema</link> no arrencaran programes que no estiguin en aquest directori. Heu d'utilitzar <literal>/</literal> com a separador de directoris en tots els entorns, incloent-hi Windows. </para> </listitem> </varlistentry> <varlistentry id="ini.safe-mode-allowed-env-vars"> <term> <parameter>safe_mode_allowed_env_vars</parameter> <type>cadena</type> </term> <listitem> <para> El fet d'establir certes variables d'entorn podria ser una potencial font de problemes de seguretat. Aquesta directiva contè una llista de prefixos (delimitats per dos punts). En el Mode Segur, l'usuari només podrà modificar les variables d'entorn els noms de les quals comencin pels prefixos indicats aquí. Per defecte, els usuaris només poden establir variables d'entorn que comencin per PHP_ (per exemple, PHP_FOO=BAR). </para> <note> <para> Si aquesta directiva és buida, el PHP deixarà que l'usuari pugui modificar QUALSEVOL variable d'entorn! </para> </note> </listitem> </varlistentry> <varlistentry id="ini.safe-mode-protected-env-vars"> <term> <parameter>safe_mode_protected_env_vars</parameter> <type>cadena</type> </term> <listitem> <para> Aquesta directiva contè una llista (delimitada per dos punts) de variables d'entorn que l'usuari final no podrà canviar utilitzant la funció <function>putenv</function>. Aquestes variables estaran protegides encara que la variable safe_mode_allowed_env_vars indiqui que poden ser modificades. </para> </listitem> </varlistentry> <varlistentry id="ini.open-basedir"> <term> <parameter>open_basedir</parameter> <type>cadena</type> </term> <listitem> <para> Limita els fitxers que poden ser oberts per PHP a l'arbre de directoris especificat, incloent-s'hi a sí mateix. Aquesta directiva <emphasis>NO</emphasis> es veu afectada pel fet que el Mode Segur estigui activat o no. </para> <para> Quan una seqüència intenta obrir un fitxer amb, per exemple, les funcions <function>fopen</function> o <function>gzopen</function>,+ es comprovarà la ubicació del fitxer. Quan el fitxer sigui fora de l'arbre de directoris especificat, el PHP no l'obrirà. Els enllaços simbòlics són resolts abans de la comprovació, de manera que no és possible d'evitar aquesta restricció amb enllaços simbòlics. </para> <para> El valor especial <systemitem class="constant">.</systemitem> indica que el directori de treball de la seqüència s'utilitzarà com a directori base. Això, però, és una mica perillós, ja que el directori de treball es pot canviar fàcilment amb la funció <function>chdir</function>. </para> <para> Al fitxer <filename>httpd.conf</filename>, open_basedir pot ser inhabilitat (per exemple, per alguns hosts virtuals) <link linkend="configuration.changes.apache">de la mateixa manera</link> que qualsevol altra directiva de configuració amb "php_admin_value open_basedir none". </para> <para> En Windows, separeu els directoris amb un punt i coma. En tots els altres sistemes, separeu els directoris amb dos punts. Igual que si fos un mòdul d'Apache, els directoris fills de les rutes d'open_basedir s'hereten automàticament. </para> <para> La restricció especificada amb open_basedir és un prefix, i no pas un nom de directori. Això vol dir que "open_basedir = /dir/incl" també permetrà l'accés a "/dir/include" i a "/dir/incls", si és que existeixen. Si el que voleu és restringir l'accés exclusivament al directori especificat, finalitzeu-lo amb una barra. Per exemple: "open_basedir = /dir/incl/" </para> <note> <para> El suport per múltiples directoris es va afegir a la versió 3.0.7. </para> </note> <para> Per defecte es permet l'accés a tots els fitxers. </para> </listitem> </varlistentry> <varlistentry id="ini.disable-functions"> <term> <parameter>disable_functions</parameter> <type>cadena</type> </term> <listitem> <simpara> Aquesta directiva us permet d'inhabilitar certes funcions per raons de <link linkend="security">security</link>. La cadena de text és una llista de noms de funció separats per dos punts. disable_funcions no es veu afectat pel <link linkend="ini.safe-mode">Mode Segur</link>. </simpara> <simpara> Aquesta directiva s'ha d'especificar al &php.ini; Per exemple, no podeu especificar-la al fitxer &httpd.conf;. </simpara> </listitem> </varlistentry> <varlistentry id="ini.disable-classes"> <term> <parameter>disable_classes</parameter> <type>cadena</type> </term> <listitem> <simpara> Aquesta directiva us permet d'inhabilitar certes classes per raons de <link linkend="security">seguretat</link>. La cadena és una llista de noms de classes separats per dos punts. disable_classes no es veu afectat pel <link linkend="ini.safe-mode">Mode Segur</link>. </simpara> <simpara> Aquesta directiva s'ha d'especificar al &php.ini; Per exemple, no la podeu especificar al fitxer &httpd.conf;. </simpara> <note> <title>Nota de disponibilitat</title> <simpara> Aquesta directiva va començar a estar disponible a la versió PHP 4.3.2 </simpara> </note> </listitem> </varlistentry> </variablelist> </para> <para> Vegeu també: <link linkend="ini.register-globals">register_globals</link>, <link linkend="ini.display-errors">display_errors</link>, i <link linkend="ini.log-errors">log_errors</link>. </para> <para> Quan <link linkend="ini.safe-mode">safe_mode</link> està activat, el PHP comprova si el propietari de la seqüència actual és el mateix que el propietari del fitxer (o del seu director) tractat per una funció de fitxer. Per exemple: <programlisting role="ls"> <![CDATA[ -rw-rw-r-- 1 rasmus rasmus 33 Jul 1 19:20 sequencia.php -rw-r--r-- 1 root root 1116 May 26 18:01 /etc/passwd ]]> </programlisting> Executant el fitxer sequencia.php <programlisting role="php"> <![CDATA[ <?php readfile('/etc/passwd'); ?> ]]> </programlisting> provocarà el següent error quan el mode segur estigui activat: <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/sequencia.php on line 2 (Avís: Restricció de MODE SEGUR està activa. La seqüència amb uid 500 no té permisos per accedir al fitxer /etc/passwd que és propietat del uid 0 en /docroot/sequencia.php a la línia 2) ]]> </screen> </para> <para> Això no obstant, hi pot haver entorns on una comprovació estricta d'<literal>UID</literal> no és adequada i es pot realitzar una restricció més relaxada, basada en <literal>GID</literal>, que ja sigui suficient. Això se suporta a través de l'opció <link linkend="ini.safe-mode-gid">safe_mode_gid</link>. Especificant aquesta opció a <literal>On</literal> realitza la comprovació relaxada de <literal>GID</literal>, mentre que si és a <literal>Off</literal> (el seu valor per defecte) s'efectua la comprovació per <literal>UID</literal>. </para> <para> Si enlloc de <link linkend="ini.safe-mode">safe_mode</link>, especifiqueu un directori en <link linkend="ini.open-basedir">open_basedir</link>, llavors totes les operacions de fitxers estaran limitades als fitxers sota el directori especificat. Per exemple (exemple del fitxer &httpd.conf; d'Apache): <programlisting role="ini"> <![CDATA[ <Directory /docroot> php_admin_value open_basedir /docroot </Directory> ]]> </programlisting> Si executeu el mateix fitxer sequencia.php amb aquesta configuració de <link linkend="ini.open-basedir">open_basedir</link>, el resultat serà el següent: <screen> <![CDATA[ Warning: open_basedir restriction in effect. File is in wrong directory in /docroot/sequencia.php on line 2 (Avís: restricció open_basedir activa. El fitxer és en una ruta incorrecta a /docroot/sequencia.php a la línia 2) ]]> </screen> </para> <para> També podeu inhabilitar funcions individuals. Observeu que la directiva <link linkend="ini.disable-functions">disable_functions</link> no pot ser especificada fora del fitxer &php.ini;, la qual cosa vol dir que no podeu inhabilitar funcions segons el virtualhost o el directori, en el fitxer &httpd.conf;. Si afegim això al fitxer &php.ini;: <programlisting role="ini"> <![CDATA[ disable_functions readfile,system ]]> </programlisting> Llavors obtenim aquesta sortida: <screen> <![CDATA[ Warning: readfile() has been disabled for security reasons in /docroot/sequencia.php on line 2 (Avís: readfile() ha estat desactivat per raons de seguretat a /docroot/sequencia.php a la línai 2) ]]> </screen> </para> <warning> <para> Per suposat, aquestes restriccions no són vàlides, en els binaris executats </para> </warning> </sect1> <sect1 id="features.safe-mode.functions"> <title>Funcions restringides/inhabilitades pel mode segur</title> <para> Aquest és un llistat (probablement incomplert i incorrecte) de les funcions limitades pel <link linkend="features.safe-mode">mode segur</link>. <!-- TODO: add &note.sm.*; to the functions mentioned here. That entity should link to this section --> <table> <title>Funcions limitades pel mode segur</title> <tgroup cols="2"> <thead> <row> <entry>Funció</entry> <entry>Limitació</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>ifx_*</entry> <entry>restriccions sql_safe_mode, (!= safe mode)</entry> <!-- TODO: more info on sql-safe-mode --> </row> <row> <entry>ingres_*</entry> <entry>restriccions sql_safe_mode, (!= safe mode)</entry> <!-- TODO: more info on sql-safe-mode --> </row> <row> <entry>mysql_*</entry> <entry>restriccions sql_safe_mode, (!= safe mode)</entry> <!-- TODO: more info on sql-safe-mode --> </row> <row> <entry><function>pg_lo_import</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>Fa cas de les directives safe_mode_protected_env_vars i safe_mode_allowed_env_vars. Vegeu també la documentació sobre <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">l'operador accent obert</link></entry> <entry>&sm.disabled;</entry> </row> <row> <entry><function>shell_exec</function> (equivalent funcional de l'operador accent obert)</entry> <entry>&sm.disabled;</entry> </row> <row> <entry><function>exec</function></entry> <entry>Només serà possible d'executar els executables dins de les rutes indicades per <link linkend="ini.safe-mode-exec-dir">safe_mode_exec_dir</link>. Per raons pràctiques, actualment no es permet d'utilitzar el component <literal>..</literal> en la ruta d'un executable. La funció <function>escapeshellcmd</function> s'executa sobre l'argument d'aquesta funció.</entry> </row> <row> <entry><function>system</function></entry> <entry>Només serà possible d'executar els executables dins de les rutes indicades per <link linkend="ini.safe-mode-exec-dir">safe_mode_exec_dir</link>. Per raons pràctiques, actualment no es permet d'utilitzar el component <literal>..</literal> en la ruta d'un executable. La funció <function>escapeshellcmd</function> s'executa sobre l'argument d'aquesta funció.</entry> </row> <row> <entry><function>passthru</function></entry> <entry>Només serà possible d'executar els executables dins de les rutes indicades per <link linkend="ini.safe-mode-exec-dir">safe_mode_exec_dir</link>. Per raons pràctiques, actualment no es permet d'utilitzar el component <literal>..</literal> en la ruta d'un executable. La funció <function>escapeshellcmd</function> s'executa sobre l'argument d'aquesta funció.</entry> </row> <row> <entry><function>popen</function></entry> <entry>Només serà possible d'executar els executables dins de les rutes indicades per <link linkend="ini.safe-mode-exec-dir">safe_mode_exec_dir</link>. Per raons pràctiques, actualment no es permet d'utilitzar el component <literal>..</literal> en la ruta d'un executable. La funció <function>escapeshellcmd</function> s'executa sobre l'argument d'aquesta funció.</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>fopen</function></entry> <entry>&sm.uidcheck.dir;</entry> </row> <row> <entry><function>mkdir</function></entry> <entry>&sm.uidcheck.dir;</entry> </row> <row> <entry><function>rmdir</function></entry> <entry>&sm.uidcheck.dir;</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; (tant per l'<parameter>source</parameter> com per la <parameter>destinació</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; A més, no podeu especificar els bits SUID, SGIF i el bit enganxós.</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; (nota: només es comprova la destinació)</entry> </row> <row> <entry><function>link</function></entry> <entry>&sm.uidcheck; &sm.uidcheck.dir; (nota: només es comprova la destinació)</entry> </row> <row> <entry><function>apache_request_headers</function></entry> <entry>En mode segur, les capçaleres que comencen per 'authorization' (majúscules o minúscules) no seran retornades.</entry> </row> <row> <entry><function>header</function></entry> <entry>En mode segur, l'uid de la seqüència s'afegirà a la part del <literal>reialme</literal> de la capçalera <literal>WWW-Authenticate</literal> si establiu aquesta capçalera (això s'utilitza per Autenticació HTTP).</entry> </row> <row> <entry><link linkend="features.http-auth">PHP_AUTH variables</link></entry> <entry> En mode segur, les variables <varname>PHP_AUTH_USER</varname>, <varname>PHP_AUTH_PW</varname>, i <varname>AUTH_TYPE</varname> no estan disponibles en <varname>$_SERVER</varname>. De tota manera, encara podeu utilitzar <varname>REMOTE_USER</varname> per l'USUARI. (nota: només té efecte des de PHP 4.3.0) </entry> </row> <row> <entry> <function>highlight_file</function>, <function>show_source</function> </entry> <entry> &sm.uidcheck; &sm.uidcheck.dir; (nota: només té efecte des de PHP 4.2.1) </entry> </row> <row> <entry> <function>parse_ini_file</function> </entry> <entry> &sm.uidcheck; &sm.uidcheck.dir; (nota: només té efecte des de PHP 4.2.1) </entry> </row> <row> <entry> <function>set_time_limit</function> </entry> <entry> No té efecte quan el PHP s'executa en &safemode;. </entry> </row> <row> <entry> <link linkend="ini.max-execution-time">max_execution_time</link> </entry> <entry> No té efecte quan el PHP s'executa en &safemode;. </entry> </row> <row> <entry> <function>mail</function> </entry> <entry> En mode segur, el cinquè paràmetre està inhabilitat. (nota: només té efecte des de PHP 4.2.3) </entry> </row> <row> <entry>Qualsevol funció que utilitzi <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 -->
« previous php.doc.ca (#72) next »