<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/security.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'es',
  ),
  'this' => 
  array (
    0 => 'security.errors.php',
    1 => 'Reportando errores',
    2 => 'Reportando errores',
  ),
  'up' => 
  array (
    0 => 'security.php',
    1 => 'Seguridad',
  ),
  'prev' => 
  array (
    0 => 'security.database.sql-injection.php',
    1 => 'Inyecci&oacute;n de SQL',
  ),
  'next' => 
  array (
    0 => 'security.variables.php',
    1 => 'Datos Enviados por el Usuario',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'security/errors.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="security.errors" class="chapter">
   <h1 class="title">Reportando errores</h1>

   <p class="para">
    Con la seguridad de PHP, hay dos formas para reportar errores. Una es
    en beneficio, para incrementar la seguridad, y la otra es para perjudicar.
   </p>
   <p class="para">
    Una táctica estándar de ataque conlleva a perfilar un sistema; llenándolo
    de datos incorrectos, revisando los tipos y contextos de los errores
    que son devueltos. Esto le permite al atacante recolectar información
    acerca del servidor, para determinar posibles debilidades.
    Por ejemplo, si un atacante ha recogido información sobre una página
    basada en un envío previo, él podría intentar sobrescribir las variables,
    o modificarlas:
    <div class="example" id="example-1">
     <p><strong>Ejemplo #1 Atacando variables con una página HTML personalizada</strong></p>
     <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;form method=&quot;post&quot; action=&quot;objetivodelataque?username=badfoo&amp;amp;password=badfoo&quot;&gt;
&lt;input type=&quot;hidden&quot; name=&quot;username&quot; value=&quot;badfoo&quot; /&gt;
&lt;input type=&quot;hidden&quot; name=&quot;password&quot; value=&quot;badfoo&quot; /&gt;
&lt;/form&gt;</pre>
</div>
     </div>

    </div>
   </p>
   <p class="para">
    Los errores de PHP que normalmente son devueltos, pueden ser muy útiles para
    el desarrollador que está intentando depurar un script, indicando qué cosas,
    como por ejemplo, qué función o qué fichero de PHP falló, y el número de línea en donde
    la falla ocurrió. Toda esta es la información que puede ser explotada.
    Esto no es algo raro para un desarrollador de PHP que utilice las funciones
    <span class="function"><a href="function.show-source.php" class="function">show_source()</a></span>, <span class="function"><a href="function.highlight-string.php" class="function">highlight_string()</a></span>, o
    <span class="function"><a href="function.highlight-file.php" class="function">highlight_file()</a></span> como una medida de depuración, pero en
    un sitio en escena, esto puede exponer variables ocultas, sintáxis sin revisar,
    y otra información peligrosa. Es especialmente peligroso el código en ejecución
    de fuentes conocidas con manejadores de depuración incluidos, o utilizar
    técnicas comunes de depuración. Si los atacantes pueden determinar qué técnica en
    general usted está utilizando, ellos podrían tratar de usar fuerza bruta en una página,
    enviando varias cadenas comunes de depuración:
    <div class="example" id="example-2">
     <p><strong>Ejemplo #2 Explotando variables comunes de depuración</strong></p>
     <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;form method=&quot;post&quot; action=&quot;objetivodelataque?errors=Y&amp;amp;showerrors=1&amp;amp;debug=1&quot;&gt;
&lt;input type=&quot;hidden&quot; name=&quot;errors&quot; value=&quot;Y&quot; /&gt;
&lt;input type=&quot;hidden&quot; name=&quot;showerrors&quot; value=&quot;1&quot; /&gt;
&lt;input type=&quot;hidden&quot; name=&quot;debug&quot; value=&quot;1&quot; /&gt;
&lt;/form&gt;</pre>
</div>
     </div>

    </div>
   </p>
   <p class="para">
    Sin importar el método de manejo de errores, la capacidad de probar
    errores en un sistema conlleva a proveer a un atacante con mas
    información.
   </p>
   <p class="para">
    Por ejemplo, el estilo común de un error genérico de PHP indica que un sistema
    ciertamente está ejecutando PHP. Si un atacante está en una página <code class="literal">.html</code>, y quiere
    probar qué motor hay tras de ese servidor (para buscar debilidades en el sistema),
    lo alimenta con datos erróneos que lo podrían habilitar a que determine
    que ese sistema fue construido con PHP.
   </p>
   <p class="para">
    El error de una función puede indicar ya sea, un sistema que puede estar
    ejecutando un motor específico de base de datos, o dar las pistas de cómo una página web
    puede estar programada o diseñada. Esto permite una investigación más profunda dentro
    de los puertos abiertos de la base de datos, o buscar errores específicos o debilidades
    en una página web. Pasando diferentes porciones de datos erróneos, por ejemplo,
    un atacante puede determinar el orden de autenticación en un script,
    (por medio del número de línea de los errores) como también probar exploits
    que pueden ser utilizados en diferentes ubicaciones del script.
   </p>
   <p class="para">
    Un error del sistema de archivos o un error general de PHP puede indicar qué permisos
    tiene el servidor web, así también la estructura y organización de
    ficheros en el servidor web. El código de error escrito por el desarrollador puede agravar
    este problema, conllevando a la explotación fácil de la, hasta entonces,
    información &quot;oculta&quot;.
   </p>
   <p class="para">
    Hay tres grandes soluciones a este problema. La primera consiste en
    examinar todas las funciones, e intentar arreglar la mayoría
    de los errores. La segunda es deshabilitar completamente la notificación de errores
    de el código en ejecución. La tercera es utilizar las funciones de manejo de error
    propias de PHP para crear su propio manejador de errores. Dependiendo
    de su política de seguridad, puede ser que encuentre que las tres sean aplicables
    a su situación.
   </p>
   <p class="para">
    Una forma de detectar este problema por adelantado es hacer uso de
    la función propia de PHP <span class="function"><a href="function.error-reporting.php" class="function">error_reporting()</a></span>, para ayudarle a
    asegurar su código y encontrar el uso de variables que podrían ser peligrosas.
    Al probar su código, antes de distribuirlo, con <strong><code><a href="errorfunc.constants.php#constant.e-all">E_ALL</a></code></strong>,
    usted puede encontrar rapidamente áreas donde sus variables pueden ser abiertas para envenenamiento
    o modificación en otras maneras. Una vez usted está listo para distribuirlo,
    debería deshabilitar completamente el reporte de errores poniendo el valor de
    <span class="function"><a href="function.error-reporting.php" class="function">error_reporting()</a></span> a 0, o apagar el visor de errores
    utilizando la  opción <code class="literal">display_errors</code> del fichero <var class="filename">php.ini</var>
    para aislar su código de ataques. Si decide hacer esto último,
    también debería definir la ruta de acceso a su archivo de registros utilizando
    la directiva <code class="literal">error_log</code>, y poner
    <code class="literal">log_errors</code> en &quot;on&quot;.
    <div class="example" id="example-3">
     <p><strong>Ejemplo #3 Buscando variables peligrosas con E_ALL</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">if (</span><span style="color: #0000BB">$username</span><span style="color: #007700">) {  </span><span style="color: #FF8000">// No se ha inicializado o revisado antes de utilizar<br />    </span><span style="color: #0000BB">$good_login </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />}<br />if (</span><span style="color: #0000BB">$good_login </span><span style="color: #007700">== </span><span style="color: #0000BB">1</span><span style="color: #007700">) { </span><span style="color: #FF8000">// Si la prueba anterior falla, los que no estén inicializados o comprobados antes de utilizar, tendrán acceso<br />    </span><span style="color: #0000BB">readfile</span><span style="color: #007700">(</span><span style="color: #DD0000">"/ruta/hacia/datos/altamente/sensibles/index.html"</span><span style="color: #007700">);<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
  </div>
<?php manual_footer($setup); ?>