Foros del Web » Programando para Internet » PHP »

Posteen sus tips de seguridad PHP

Estas en el tema de Posteen sus tips de seguridad PHP en el foro de PHP en Foros del Web. Que les parece si armamos una recopilacion de tips de seguridad php & mysql alli van los mios * Desactiva register_globals * Inicializar todas las ...
  #1 (permalink)  
Antiguo 24/01/2006, 22:06
 
Fecha de Ingreso: octubre-2004
Mensajes: 251
Antigüedad: 19 años, 5 meses
Puntos: 1
Posteen sus tips de seguridad PHP

Que les parece si armamos una recopilacion de tips de seguridad php & mysql
alli van los mios

* Desactiva register_globals
* Inicializar todas las variables usadas a valores nulos
* Filtra todos los datos externos
* display_errors = off
* log_errors = on
* Usar el método POST en vez de GET en las formas a menos que sea seguro usar get
* No nombrar los archivos de conexión y configuración con extensión .inc solo usar php
* include()
* requiere()
* activar safe_mode
  #2 (permalink)  
Antiguo 25/01/2006, 16:10
 
Fecha de Ingreso: octubre-2004
Mensajes: 251
Antigüedad: 19 años, 5 meses
Puntos: 1
ninguno?? mm
  #3 (permalink)  
Antiguo 25/01/2006, 16:14
Avatar de mauled  
Fecha de Ingreso: marzo-2005
Ubicación: Cd. de México.
Mensajes: 3.001
Antigüedad: 19 años, 1 mes
Puntos: 33
De acuerdo

1)Encriptar información confidencial
2)El uso de session() o setcookie() para la autentificacion del usuario.
3)Eliminar el uso de variables globales
5)Uso correcto de GET
  #4 (permalink)  
Antiguo 25/01/2006, 17:23
Avatar de Mickel  
Fecha de Ingreso: mayo-2002
Ubicación: Lima, Peru
Mensajes: 4.619
Antigüedad: 21 años, 11 meses
Puntos: 7
No se olviden de lo importante que es prevenir query injection...
__________________
No tengo firma ahora... :(
  #5 (permalink)  
Antiguo 25/01/2006, 18:19
 
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
  #6 (permalink)  
Antiguo 25/01/2006, 20:44
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
se me ocurre otra:
Controlar qué se permite y qué no en los campos, no permitir (por ejemplo) caracteres no imprimibles en los campos de texto en general, y permitir sólamente en los textarea los caracteres \n y/o \r

No relacionada sólo con php, sino con web en general: siempre poner un index.html en todas las carpetas, aunque lo único que haga sea redirigir (siempre de forma transparente y automática) a otra página del sitio.

Redirigir siempre todas las páginas que procesen formularios, para evitar que el formulario se envíe de nuevo al actualizar.

No permitir que se muestren mensajes de error que den datos de más sobre el servidor.

y seguramente muchos otros de los que no tengo ni idea.


Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:07.