1
0
mirror of https://github.com/php/doc-es.git synced 2026-03-27 00:42:10 +01:00
Files
archived-doc-es/features/safe-mode.xml
Pedro Antonio Gil Rodríguez b29faa41af Revisión
git-svn-id: https://svn.php.net/repository/phpdoc/es/trunk@337921 c90b9560-bf6c-de11-be94-00142212c4b1
2015-09-27 18:20:14 +00:00

613 lines
21 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 2bb07c8c43f028c665a33bfc08a22639e9e35dc6 Maintainer: seros Status: ready -->
<!-- Reviewed: yes Maintainer: seros -->
<chapter xml:id="features.safe-mode" xmlns="http://docbook.org/ns/docbook">
<title>Modo seguro</title>
<para>
El modo seguro de PHP es un intento de resolver el problema de seguridad con servidores
compartidos. Es arquitectónicamente incorrecto intentar resolver este
problema al nivel de PHP, pero debido a que las alternativas al nivel de servidores
web y sistemas operativos no son muy realistas, muchos,
especialmente los ISP, utilizan por ahora el modo seguro.
</para>
&warn.deprecated.feature-5-3-0.removed-5-4-0;
<para>
<table>
<title>Registro de cambios para el <literal>modo seguro</literal></title>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>5.4.0</entry>
<entry>
Eliminado de PHP, genrando un error fatal de nivel <constant>E_CORE_ERROR</constant>
al habilitarlo.
</entry>
</row>
<row>
<entry>5.3.0</entry>
<entry>
Obsoleto, añadiéndose errores de nivel <constant>E_DEPRECATED</constant>.
</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<sect1 xml:id="ini.sect.safe-mode">
<title>Seguridad y modo seguro</title>
<para>
<table>
<title>Directivas de configuración de seguridad y modo seguro</title>
<tgroup cols="4">
<thead>
<row>
<entry>&Name;</entry>
<entry>&Default;</entry>
<entry>&Changeable;</entry>
<entry>&Changelog;</entry>
</row>
</thead>
<tbody>
<row>
<entry><link linkend="ini.safe-mode">safe_mode</link></entry>
<entry>"0"</entry>
<entry>PHP_INI_SYSTEM</entry>
<entry>Eliminada en PHP 5.4.0.</entry>
</row>
<row>
<entry><link linkend="ini.safe-mode-gid">safe_mode_gid</link></entry>
<entry>"0"</entry>
<entry>PHP_INI_SYSTEM</entry>
<entry>Eliminada en PHP 5.4.0.</entry>
</row>
<row>
<entry><link linkend="ini.safe-mode-include-dir">safe_mode_include_dir</link></entry>
<entry>NULL</entry>
<entry>PHP_INI_SYSTEM</entry>
<entry>Eliminada en PHP 5.4.0.</entry>
</row>
<row>
<entry><link linkend="ini.safe-mode-exec-dir">safe_mode_exec_dir</link></entry>
<entry>""</entry>
<entry>PHP_INI_SYSTEM</entry>
<entry>Eliminada en PHP 5.4.0.</entry>
</row>
<row>
<entry><link linkend="ini.safe-mode-allowed-env-vars">safe_mode_allowed_env_vars</link></entry>
<entry>"PHP_"</entry>
<entry>PHP_INI_SYSTEM</entry>
<entry>Eliminada en PHP 5.4.0.</entry>
</row>
<row>
<entry><link linkend="ini.safe-mode-protected-env-vars">safe_mode_protected_env_vars</link></entry>
<entry>"LD_LIBRARY_PATH"</entry>
<entry>PHP_INI_SYSTEM</entry>
<entry>Eliminada en PHP 5.4.0.</entry>
</row>
</tbody>
</tgroup>
</table>
&ini.php.constants;
</para>
&ini.descriptions.title;
<para>
<variablelist>
<varlistentry xml:id="ini.safe-mode">
<term>
<parameter>safe_mode</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
Indica si habilitar el modo seguro de PHP.
Si PHP se compila con <literal>--enable-safe-mode</literal>,
el valor predeterminado será On; si no, será Off.
</para>
&warn.deprecated.feature-5-3-0.removed-5-4-0;
</listitem>
</varlistentry>
<varlistentry xml:id="ini.safe-mode-gid">
<term>
<parameter>safe_mode_gid</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
Por defecto, el modo seguro comprueba la comparación de un UID al
abrir ficheros. Si se quiere suavizar esta comparación a un GID,
se ha de activar safe_mode_gid.
Indica si usar la comprobación de <literal>UID</literal> (&false;) o de
<literal>GID</literal> (&true;) al acceder a un
fichero.
</para>
</listitem>
</varlistentry>
<varlistentry xml:id="ini.safe-mode-include-dir">
<term>
<parameter>safe_mode_include_dir</parameter>
<type>string</type>
</term>
<listitem>
<para>
Se omiten las comprobaciones de <literal>UID</literal>/<literal>GID</literal> cuando
se incluyen ficheros de este directorio y sus subdirectorios (el directorio
debe estar también en <link linkend="ini.include-path">include_path</link>
o debe incluir la ruta completa).
</para>
<simpara>
Esta directiva puede tomar una ruta separada por
dos puntos (punto y coma en Windows) de forma similar a la directiva
<link linkend="ini.include-path">include_path</link>,
en lugar de solamente un único directorio.
</simpara>
<simpara>
Realmente, la restricción especificada es un prefijo, no un nombre de directorio.
Esto significa que "<literal>safe_mode_include_dir = /dir/incl</literal>" también permite
el acceso a "<literal>/dir/include</literal>" y
"<literal>/dir/incls</literal>" si existen. Cuando solamente se quiera
restringir el acceso al directorio especificado, se ha de finalizarlo con una
barra. Por ejemplo: "<literal>safe_mode_include_dir = /dir/incl/</literal>".
</simpara>
<simpara>
Si el valor de esta directiva está vacío, no se podrán incluir ficheros con
<literal>UID</literal>/<literal>GID</literal> diferentes.
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ini.safe-mode-exec-dir">
<term>
<parameter>safe_mode_exec_dir</parameter>
<type>string</type>
</term>
<listitem>
<para>
Si PHP se emplea en modo seguro, <function>system</function> y las demás
<link linkend="ref.exec">funciones que ejecuten programas del sistema</link>
rechazarán iniciar programas que no estén en este directorio.
Se ha de emplear <literal>/</literal> como separador de directorios en
todos los entornos, incluyendo Windows.
</para>
</listitem>
</varlistentry>
<varlistentry xml:id="ini.safe-mode-allowed-env-vars">
<term>
<parameter>safe_mode_allowed_env_vars</parameter>
<type>string</type>
</term>
<listitem>
<para>
Establecer ciertas variables de entorno podría crear una brecha potencial de seguridad.
Esta directiva contiene una lista de prefijos separados por comas. En el modo seguro,
el usuario podrá solamente modificar las variables de entorno cuyos nombre comiencen con los
prefijos proporcionados aquí. Por omisión, los usuarios solamente podrán establecer
variables de entorno que comiencen con <literal>PHP_</literal>
(p.ej., <literal>PHP_FOO=BAR</literal>).
</para>
<note>
<para>
Si esta directiva está vacía, PHP permitirá al usuario modificar CUALQUIER
variable de entorno.
</para>
</note>
</listitem>
</varlistentry>
<varlistentry xml:id="ini.safe-mode-protected-env-vars">
<term>
<parameter>safe_mode_protected_env_vars</parameter>
<type>string</type>
</term>
<listitem>
<para>
Esta directiva contiene una lista de variables de entorno separadas
por comas que no podrá cambiar el un usuario que utilice
<function>putenv</function>. Estas variables estarán protegidas
incluso si safe_mode_allowed_env_vars está establecida para permitir cambiarlas.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
<para>
Véase también: <link linkend="ini.open-basedir">open_basedir</link>,
<link linkend="ini.disable-functions">disable_functions</link>,
<link linkend="ini.disable-classes">disable_classes</link>,
<link linkend="ini.register-globals">register_globals</link>,
<link linkend="ini.display-errors">display_errors</link>, y
<link linkend="ini.log-errors">log_errors</link>.
</para>
<para>
Cuando <link linkend="ini.safe-mode">safe_mode</link> está activado, PHP comprueba
si el propietario del script en uso coincide con el del fichero sobre el que se va
a operar mediante una función de ficheros o su directorio. Por ejemplo:
<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>
La ejecución de <filename>script.php</filename>:
<programlisting role="php">
<![CDATA[
<?php
readfile('/etc/passwd');
?>
]]>
</programlisting>
resultará en este error cuando el modo seguro está habilitado:
<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>
Sin embargo, podrían haber entornos donde una comprobación estricta del
<literal>UID</literal> no sea apropiada, siendo una comprobación del <literal>GID</literal>
suficiente. El soporte para esto se realiza a través de <link
linkend="ini.safe-mode-gid">safe_mode_gid</link>. Al establecerlo a
<literal>On</literal> se realiza la comprobación del <literal>GID</literal>,
y al establecerlo a <literal>Off</literal> (lo predeterminado) se realiza
la del <literal>UID</literal>.
</para>
<para>
Si en lugar de <link linkend="ini.safe-mode">safe_mode</link> se establece un
directorio de <link linkend="ini.open-basedir">open_basedir</link>, todas
las operaciones de ficheros estarán limitadas a ficheros que estén bajo el directorio especificado.
Por ejemplo (ejemplo de &httpd.conf; de Apache):
<programlisting role="ini">
<![CDATA[
<Directory /docroot>
php_admin_value open_basedir /docroot
</Directory>
]]>
</programlisting>
Si se ejecuta el mismo <filename>script.php</filename> con esta
configuración de <link linkend="ini.open-basedir">open_basedir</link>,
el resultado será este:
<screen>
<![CDATA[
Warning: open_basedir restriction in effect. File is in wrong directory in
/docroot/script.php on line 2
]]>
</screen>
</para>
<para>
También se pueden deshabilitar funciones individuales. Observe que la
directiva <link linkend="ini.disable-functions">disable_functions</link>
no se puede utilizar fuera del fichero &php.ini;, lo que significa que
no se pueden deshabilitar funciones basándose en un host virtual o directorio
en el fichero &httpd.conf;.
Si se añade lo siguiente al fichero &php.ini;:
<programlisting role="ini">
<![CDATA[
disable_functions = readfile,system
]]>
</programlisting>
se obtendrá esta salida:
<screen>
<![CDATA[
Warning: readfile() has been disabled for security reasons in
/docroot/script.php on line 2
]]>
</screen>
</para>
<warning>
<para>
Por supuesto, estas restricciones de PHP no son válidas para binarios en ejecución.
</para>
</warning>
</sect1>
<sect1 xml:id="features.safe-mode.functions">
<title>Funciones restringidas/deshabilitadas por el modo seguro</title>
<para>
Esta es una lista —probablemente incompleta y posiblemente incorrecta—
de las funciones limitadas por el
<link linkend="features.safe-mode">modo seguro</link>.
<!-- TODO: add &note.sm.*; to the functions mentioned here.
That entity should link to this section -->
<table>
<title>Funciones limitadas por el modo seguro</title>
<tgroup cols="2">
<thead>
<row>
<entry>Función</entry>
<entry>Limitaciones</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>Restricciones de sql_safe_mode, (!= modo seguro)</entry>
<!-- TODO: more info on sql-safe-mode -->
</row>
<row>
<entry>ingres_*</entry>
<entry>Restricciones de sql_safe_mode, (!= modo seguro)</entry>
<!-- TODO: more info on sql-safe-mode -->
</row>
<row>
<entry>mysql_*</entry>
<entry>Restricciones de sql_safe_mode, (!= modo seguro)</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>Obedece a las directivas ini safe_mode_protected_env_vars y
safe_mode_allowed_env_vars. Véase también la documentación
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">operador comillas invertidas</link></entry>
<entry>&sm.disabled;</entry>
</row>
<row>
<entry><function>shell_exec</function> (equivalente funcional
de las comillas invertidas)</entry>
<entry>&sm.disabled;</entry>
</row>
<row>
<entry><function>exec</function></entry>
<entry>Solamente se pueden ejecutar ejecutables dentro de <link
linkend="ini.safe-mode-exec-dir">safe_mode_exec_dir</link>.
Por razones prácticas, actualmente no está permitido tener
componentes <literal>..</literal> en la ruta del ejecutable.
<function>escapeshellcmd</function> se ejecuta en el argumento de esta
función.</entry>
</row>
<row>
<entry><function>system</function></entry>
<entry>Solamente se pueden ejecutar ejecutables dentro de <link
linkend="ini.safe-mode-exec-dir">safe_mode_exec_dir</link>.
Por razones prácticas, actualmente no está permitido tener
componentes <literal>..</literal> en la ruta del ejecutable.
<function>escapeshellcmd</function> se ejecuta en el argumento de esta
función.</entry>
</row>
<row>
<entry><function>passthru</function></entry>
<entry>Solamente se pueden ejecutar ejecutables dentro de <link
linkend="ini.safe-mode-exec-dir">safe_mode_exec_dir</link>.
Por razones prácticas, actualmente no está permitido tener
componentes <literal>..</literal> en la ruta del ejecutable.
<function>escapeshellcmd</function> se ejecuta en el argumento de esta
función.</entry>
</row>
<row>
<entry><function>popen</function></entry>
<entry>Solamente se pueden ejecutar ejecutables dentro de <link
linkend="ini.safe-mode-exec-dir">safe_mode_exec_dir</link>.
Por razones prácticas, actualmente no está permitido tener
componentes <literal>..</literal> en la ruta del ejecutable.
<function>escapeshellcmd</function> se ejecuta en el argumento de esta
función.</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; (Sobre
<parameter>source</parameter> y
<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; Además, no se pueden
establecer el SUID, el SGID y los bits adherentes</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: solamente se comprueba
el objetivo)</entry>
</row>
<row>
<entry><function>link</function></entry>
<entry>&sm.uidcheck; &sm.uidcheck.dir; (Nota: solamente se comprueba
el objetivo)</entry>
</row>
<row>
<entry><function>apache_request_headers</function></entry>
<entry>En modo seguro, no se devolverán las cabeceras que comiencen con
<literal>authorization</literal> (sin considerar mayúsculas/minúsculas).</entry>
</row>
<row>
<entry><function>header</function></entry>
<entry>En modo seguro, el UID del script se añade a la
parte <literal>realm</literal> de la
cabecera <literal>WWW-Authenticate</literal> si se establece esta
cabecera (usada para Autenticación HTTP).</entry>
</row>
<row>
<entry><link linkend="features.http-auth">Variables PHP_AUTH</link></entry>
<entry>
En modo seguro, las variables <varname>PHP_AUTH_USER</varname>,
<varname>PHP_AUTH_PW</varname>, y <varname>AUTH_TYPE</varname>
no están disponibles en <varname>$_SERVER</varname>. En cualquier caso, se
puede emplear aún <varname>REMOTE_USER</varname> para USER.
(Nota: solamente se ve afectada desde PHP 4.3.0)
</entry>
</row>
<row>
<entry>
<function>highlight_file</function>,
<function>show_source</function>
</entry>
<entry>
&sm.uidcheck; &sm.uidcheck.dir;
</entry>
</row>
<row>
<entry>
<function>parse_ini_file</function>
</entry>
<entry>
&sm.uidcheck; &sm.uidcheck.dir;
</entry>
</row>
<row>
<entry>
<function>set_time_limit</function>
</entry>
<entry>
No tiene efecto cuando PHP se está ejecutando en &safemode;.
</entry>
</row>
<row>
<entry>
<link linkend="ini.max-execution-time">max_execution_time</link>
</entry>
<entry>
No tiene efecto cuando PHP se está ejecutando en &safemode;.
</entry>
</row>
<row>
<entry>
<function>mail</function>
</entry>
<entry>
En modo seguro, el quinto parámetro está deshabilitado.
</entry>
</row>
<row>
<entry>
<function>session_start</function>
</entry>
<entry>
El propietario de un script debe ser el mismo que el propietario de un directorio
de <link linkend="ini.session.save-path">session.save_path</link> si
se emplea el gestor <literal>files</literal>
predeterminado de
<link linkend="ini.session.save-handler">session.save_handler</link>.
</entry>
</row>
<row>
<entry>
Todas las funciones de sistema de ficheros y flujos.
</entry>
<entry>
&sm.uidcheck; &sm.uidcheck.dir; (Véase la opción <link
linkend="ini.safe-mode-include-dir">safe_mode_include_dir</link>
de &php.ini;.
</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:"~/.phpdoc/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
-->