Ver Mensaje Individual
  #5 (permalink)  
Antiguo 25/01/2006, 18:19
califa010
 
Fecha de Ingreso: enero-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 299
Antigüedad: 18 años, 3 meses
Puntos: 5
Uno de los puntos más críticos, me parece, es subir archivos al servidor a través de un formulario.

Hay que validar exhaustivamente todo lo que se sube, porque si no cualquiera puede usar esa "puerta" para colgar en tu servidor un script, por ejemplo, y despúes no le quedaría más que ejecutarlo escribiendo la dirección en la barra del navegador (ese script, por ejemplo, podría borrarte todo lo que hay en el sitio!).

Un tip puntual en este tema es no confiar en los mime-types, sino examinar manualmente la extensión del archivo. Los mime-types se pueden "trampear" con saber un poco (no es que sepa cómo hacerlo, pero por lo que leí, no es muy difícil).

También tener en cuenta que toda validación (y todo código) que esté del lado del cliente debe ser considerado "sospechoso". Un ejemplo puntual: Si yo no quiero que suban archivos de más de 100 kb y confío en que en el formulario puse un input hidden "MAX_FILE_SIZE" de 100.000, puedo estar en problemas. Nada impide que alguien se baje ese formulario, modifique arbitrariamente ese valor, cambie el action para reemplazar la ruta relativa ("mi_script.php") por una ruta absoluta ("http://www.mi_sitio.com/mi_script") y lo envíe desde donde quiera (no hace falta que lo vuelva a subir al servidor).

Lo cual lleva a algo que puede dar una "falsa tranquilidad": "estoy usando POST en vez de GET, así que no pasa nada..." No. POST es tan manipulable como GET. Sólo hay que tener un conocimiento muy rudimientario de html y del protocolo http y listo (y desde ya que cualquiera que quiera atacar tu sitio sabe eso y mucho más). Usar un SERVER['HTTP_REFERER'] para verificar que el pedido llegó de un documento alojado en el server tampoco es seguro, ya que también se puede "trampear" (se explica en la documentación de php).

En lo posible, "hardcodear" los includes/requires (ej: include("script.php"), pero no include($script)). Aunque tengas las globals off, tal vez en algún momento migres a otro servidor con otra configuración, y podés llegar a olvidarte de cambiar esos valores (o puede no depender de vos). Una opción es hacer un array donde el índice sea lo que se compara a una variable que llega del usuario, y el valor de ese índice es el archivo a incluir. De esa manera, el usuario no puede determinar arbitrariamente el archivo a incluir.

Ej:
Código PHP:
$inc['p1'] =  "includes/pagina1.php";
$inc['p2'] =  "includes/pagina2.php";

$pag $_GET['pagina']; // vale p1, p2, etc

foreach ($inc as $indice=>$valor) {
         if (
$indice == $pag) {
               include(
$valor);
         } else {
               include(
"index.php"); // o algún otro archivo por defecto, si se quiere
         
}

No hacer eval's sobre $variables, especialmente si esas variables son "input" del usuario. El eval puede ser muy peligroso mal usado, porque permite interpretar un string/cadena como código php. Y si ese string llegar a través de un formulario, podrías estar en problemas. Como regla general, todos los expertos recomiendan tomar todo lo que venga del usuario "con pinzas".

Pensar en "listas blancas" en vez de en "listas negras" siempre que sea posible. Ej: En lugar de tratar de evitar que suban archivos .exe, .php, etc, si lo que querés es que suban a tu servidor sólo archivos .jpg, .png y .gif, permitir sólo lo que esté dentro de la lista blanca, en lugar de hacer una "lista negra" que siempre puede quedar incompleta.

Bueno, ahí van algunas de las que se me ocurren en este momento.

Buen tema erwinrp, me parece muy importante estar al tanto de estas cosas.

Saludos
Califa