Evitar spam en formularios PHP

Los formularios de los sitios web que se procesan y se envian a una dirección de correo electrónico pueden ser aprovechados por los «spammers» para hacer envios masivos de «spam» utilizando los servidores de correo y la IP de la maquina en la que se aloja el dominio. En este manual vamos a ver como podemos hacer que nuestros formularios sean un poco más seguros, evitando los ataques del tipo «email injection» a los que muchos formularios son sensibles.

1. En que consiste el «email injection»

Un ataque a un formulario del tipo «email injection» consiste en que el «spammer» aprovecha un formulario de un sitio web para «inyectar» cabeceras de email con direcciones y contenidos diferentes a los establecida en el formulario. Un «spammer» puede, a través de la inyección de cabeceras cambiar tanto el mensaje enviado, como los destinatarios, utilizando nuestro servidor de correo y nuestra maquina y nuestro dominio como emisor del mensaje, con lo que seremos nosotros los que estaremos haciendo «SPAM», y el rastro hasta el «spammer» se pierde.

Aquí tenemos un correo de ejemplo:

To:direccion@destinataria.com
Subject:Motivo del mensaje
From:direccion@emisora.com
Este seria el cuerpo del mensaje.

Dicho esto, la técnica utilizada por el spammer es incluir y/o alterar las cabeceras del mensaje por las suyas propias, antes de que se produzcan 2 saltos de línea, y por tanto, comienze el cuerpo del mensaje. Si el spammer consigue alterar o introducir sus cabeceras, los destinatarios y el cuerpo del mensaje se pueden alterar. Asi por ejemplo, si tenemos el siguiente correo:

To:direccion@destinataria.com
Subject:Motivo del mensaje
From:direccion@emisora.com
To:nuevadireccion@destinataria.com
Cc:otradireccion@spameada.com
Subject:Nuevo subject del mensaje spameado
Texto introducido por el spammer.

Este seria el cuerpo del mensaje.

Observamos que después del «From:» original, el «spammer» ha añadido un nuevo «To:» y otras direcciones de correo con la etiqueta «Cc:». También ha introducido un nuevo texto en el cuerpo del mensaje. El hecho de que haya 2 cabeceras «To:», o 2 «Subject:», no supone ningún problema. En la mayoría de los casos, si una cabecera se define 2 veces, la última es la que se tiene en cuenta.

Un correo básico se compone normalmente de 2 partes: las cabeceras, y un cuerpo del mensaje. Sin embargo, utilizando cabeceras especificas a tal fin, un correo pude tener varios «bodys» o cuerpos de mensaje alternativos. Por simplificar analizamos aquí la estructura de un correo básico.

2. Como puede el spammer inyectar cabeceras en la función mail() de PHP

La función que habitualmente se utiliza en PHP para enviar a una dirección de correo electrónico los datos de un formulario será mail(). La sintáxis de esta función es la siguiente:

  • mail (To, Subject, Mensaje, Headers, Parametros_Adicionales);

El siguiente es un script de ejemplo básico de un formulario que se enviará a una dirección de correo:

  • $to=»webmaster@website.com»;//direccion destinataria «hardcoded»
    if (!isset($_POST[«send»])){
    // si no vienen datos-> mostrar el form
    ?>To: webmaster@website.com
    From:
    Subject :
    Message :

    }else{
    // si vienen datos POST.. procesamos y enviamos los datos del form
    $from=$_POST[’sender’];
    // send mail :
    if (mail($to,$_POST[’subject’],$_POST[’message’],»From: $from\n»)){
    // si se ha enviado correctamente mostramos un mensaje de OK
    echo «Su mensaje se ha enviado correctamente a $to.»;
    }else{
    // Se ha producido un error
    echo «Su mensaje no se ha podido enviar»;
    }
    }
    ?>

En el ejemplo anterior, mostramos un formulario de contacto donde el usuario puede incluir el From, el Subject del Mensaje y el Mensaje. El destinatario «To:» esta «hardcoded» y en principio un usuario no tiene la opción de alterarlo. Sin embargo, esto no nos garantiza nada tal y como hemos visto anteriormente. Un usuario spammer, aprovecharía el campo «From:» para introducir sus propias cabeceras. Solo tiene que añadir un salto de línea al campo del formulario e insertar otras cabeceras. El caracter hexadecimal «%0A» es el equivalente a un salto de línea. Por tanto, si el spammer introduce en el campo «From:» el siguiente contenido:

  • direccionFrom@ficticia.com%0ATo:nuevadireccion@destinataria.com%0ACc:otradireccion@spameada.com%0ASubject:Nuevo subject del mensaje spameado%0A%0ATexto introducido por el spammer en el cuerpo de texto.

Cuando se procese el formulario, las “headers” maliciosas llegarán a la función mail() y gracias a los saltos de línea introducidos en el campo From. Los últimos 2 saltos de línea marcan el comienzo del “body” y a partir de ahí, todo lo demas formará parte del cuerpo del mensaje. En nuestro ejemplo, el spammer no necesita hacer esto último, ya que tiene un campo en el que puede introducir su propio mensaje, pero esta técnica muestra como se puede alterar hasta el cuerpo del mensaje una vez que podemos inyectar nuestras propias cabeceras. El mensaje de correo que devolverá la función mail() será el siguiente:

To:direccion@destinataria.com
Subject:Motivo del mensaje
From:direccion@emisora.com
To:nuevadireccion@destinataria.com
Cc:otradireccion@spameada.com
Subject:Nuevo subject del mensaje spameado
Texto introducido por el spammer en el cuerpo de texto.
Este seria el cuerpo del mensaje.

Que como vimos anteriormente, produce un envio a direcciones diferentes de las previstas, y con otro Subject y Body. Logicamente, el spammer puede introducir tantas direcciones separadas por comas como quiera, con lo que en un simple envio pueden salir cientos de correos SPAM desde nuestro formulario.

En formularios más restrictivos, en los que el cuerpo del mensaje esta «hardcoded» y no se coge desde un campo del formulario, el spammer puede añadir una cabecera del tipo: «Content-Type: multipart/mixed; boundary=»SeparadorDePartes», que permitiría crear un mensaje multi-partes. En un mensaje del tipo «multi-partes», se establece una cadena como «separador» que marcará donde comienza y termina cada parte. Asi, «–SeparadorDePartes», marca el comienzo de una nueva parte del mensaje, que terminará cuando se encuentre nuevamente otro «–SeparadorDePartes» que indique el comienzo de otra parte. Finalmente, «–SeparadorDePartes–» con dos guiones al final, marcaría el final del cuerpo del mensaje.

Utilizando esta cabecera y otras similares, un spammer puede ocultar el cuerpo del mensaje originalmente establecido, dejandolo fuera del separador que marca el fin del body. También podría utilizar esta técnica para añadir ficheros adjuntos, ya que cada una de las partes puede tener su propio «Content-Type», y por tanto podemos hacer que una de las partes sea una imagen o un fichero binario, como se puede ver en esta ejemplo de «email injection» avanzado.
Soluciones

Después de habernos extendido en la explicación del problema, con el fin de que quede claro como se produce, podemos sentir un poco de pánico, aunque en realidad la solución o soluciones (hay varias) son bien sencillas.
Detectar los saltos de línea con expresiones regulares

La más abordable inicialmente es proteger nuestro script para que no le lleguen cabeceras indeseadas. Hemos de tener especial cuidado en todos aquellos campos de un formulario cuyo destino sea el parametro «headers» de la función mail(). En nuestro ejemplo básico el «From:». En lugar de pasarlo directamente, tendremos que hacer una comprobación sobre estos campos y asegurarnos que no vienen saltos de línea, en cuyo caso podemos estar sufriendo una «email injection» y podemos detener el script:

$from = $_POST[«sender»];
$from = urldecode($from);
if (eregi(«\r»,$from) || eregi(«\n»,$from)){
die(«Posible email injection»);
}
?>

También es recomendable utilizar librerias como la Zend_Mail para enviar correos. Esta libreria realiza varias comprobaciones de seguridad antes de enviar el correo, de forma que el usuario no tiene que preocuparse por estos aspectos. Existen otras librerias para el envio de correos que también toman este tipo de precauciones. En cualquier caso, no es menos cierto que existen muchos más scripts hechos personalmente con usuarios poco o nada experimentados y que son el objetivo de los spammers. Para ellos va este Post, a ver si entre todos les ponemos las cosas un poco más dificiles a los spammers. Cuidado con los formularios del tipo «Send to a friend»

Es algo obvio pero como observo que todavía es una practica extendida veo aconsejable recordar lo siguiente. Las medidas de seguridad mencionadas en este manual le protegen o tratan de hacerlo del uso pernicioso que algunos spammers pueden hacer de un formulario previsto con otra funcionalidad.

Sin embargo, poco o nada se puede hacer con algunos formularios del tipo «send to a friend» o «enviar a un amigo» que no han observado la más mínima medida de seguridad. Me refiero a esos formularios que permiten a un usuario anónimo rellenar un formulario en el que todo se puede establecer: El «To:», el «From:», el «Subject:» y el «Body:». Estos formularios pueden ser utilizados como proxies de correo por cualquiera, «spammer» o no. Cualquiera puede enviar un correo a la dirección que quiera, con el subject que quiera, el cuerpo del mensaje que quiera, y simular la dirección desde que lo enviará que quiera, y sin necesidad de utilizar ninguna técnica ni hack para inyectar cabeceras.

En fin, se que es una obviedad, pero había que comentarlo porque hay muchos formularios así. No utilize NUNCA este tipo de formularios sin tomar precauciones obvias de seguridad. Aseguese al menos de que el «From:» no puede ser establecido por el usuario, enviando los correos desde una dirección «fija». Limite las posibilidades de introducir un «Subject:» o un «Body:» personalizado y siga las reglas de filtrado explicadas en este post para evitar ataques «email injection».

Para seguir leyendo :

* https://www.securephpwiki.com/index.php
* https://blogs.pathf.com/highperf/2006/05/php_spam_inject.html

Como Trabajar Correctamente con PHP

Trabajar con PHP implica tener ciertos conocimientos avanzados en cuanto a configuración y puesta en marcha de los scripts.
Existen Scripts los cuales precisan la activación de ciertos parámetros del lado del servidor los cuales no estan activos por defecto ya que hoy en dia no son usados, demandan demasiados recursos, o bien son inseguros; sin embargo los podras activar e implementar bajo tu plena responsabilidad. Uno de los parámetros no activos por ya no ser muy usados es register_globals, sin embargo algunos scripts antiguos que pululan por la red requieren su activación.

PASO 1
En la carpeta public_html existe un archivo especial llamado .htaccess en el cual insertaremos las instrucciones necesarias especificas para este tipo de archivo, como ejemplo activaremos el register_globals: php_flag register_globals on luego guardamos y ahora si ya estará activo el párametro, de la misma manera si necesitamos activar mas parámetros lo haremos desde ahí.

¿Que pasa al instalar PHPSuexec?
La mayoría de los usuarios no notarán el cambio en el funcionamiento de su página Web, ya que seguirá funcionando todo tal y como les funcionaba antes del cambio, los únicos que tendrán problemas serán los alojamientos que utilicen el .htaccess para unas determinadas cosas, que explicamos posteriormente, y los que tengan permisos en alguna carpeta o en algún fichero 777.

Problemas con .htaccess
Los alojamientos que utilicen .htaccess para activar las register globals, con PHP_FLAG, aparecerá un error 500 al abrir la página, para solucionar esto, es decir, para activar las register globals con SUEXEC, lo tendrán que hacer a nivel de directorio, es decir, las register globals se tienen que activar para cada directorio del alojamiento, hay que crear un archivo llamado php.ini que contenga la siguiente línea:

register_globals = On;

Los .htaccess que contengan valores para PHP_VALUE también darán error 500 en la página, debido a que con SUEXEC no es posible usar ese tipo de directivas.

También generaran error los .htaccess que contengan la directiva ForceType, la cual hay que sustituir por SetHandler, por poner un ejemplo:

Antes de PHPSuexec:
ForceType application/x-httpsd-php

Con PHPSuexec debería cambiar por:
SetHandler application/x-httpsd-php

Problemas más comunes que pueden aparecer con php SUEXEC
Si con la implantación de php SUEXEC usted detecta fallos tipo 500 internal server error, lo primero que tiene que hacer es lo siguiente:

1.- Comprueba los permisos de los archivos y carpetas de tu alojamiento, no pueden superar ninguno los permisos 755, por defecto, todos los archivos subidos mediante ftp tienen los permisos 644, con los cuales funcionan la mayoría de los scripts, pero si algún script requiere de permisos más estrictos, con 755 deberían funcionar sin ningún problema.

2.- Asegúrate que tu .htaccess no contiene directivas tipo PHP FLAG/VALUE o ForceType, ya que estas directivas necesitan hacerse de otra forma tal y como se ha explicado en este manual.

PASO 1
En la carpeta public_html crear un archivo llamado php.ini en el cual insertaremos las instrucciones necesarias especificas para este tipo de archivo, como ejemplo activaremos el register_globals: register_globals = On; luego guardamos y ahora si ya estará activo el párametro, de la misma manera si necesitamos activar mas parámetros lo haremos desde aqui.

De esta manera se logra trabajar correctamente con los diferentes parámetros que requiere PHP.

 

Programa en PHP

PHP es un lenguaje de programación interpretado, diseñado originalmente para la creación de páginas web dinámicas. Es usado principalmente en interpretación del lado del servidor (server-side scripting) pero actualmente puede ser utilizado desde una interfaz de línea de comandos o en la creación de otros tipos de programas incluyendo aplicaciones con interfaz gráfica usando las bibliotecas Qt o GTK+.

PHP es un acrónimo recursivo que significa PHP Hypertext Pre-processor (inicialmente PHP Tools, o, Personal Home Page Tools). Fue creado originalmente por Rasmus Lerdorf en 1994; sin embargo la implementación principal de PHP es producida ahora por The PHP Group y sirve como el estándar de facto para PHP al no haber una especificación formal. Publicado bajo la PHP License, la Free Software Foundation considera esta licencia como software libre.

PHP es un lenguaje interpretado de propósito general ampliamente usado y que está diseñado especialmente para desarrollo web y puede ser embebido dentro de código HTML. Generalmente se ejecuta en un servidor web, tomando el código en PHP como su entrada y creando páginas web como salida. Puede ser desplegado en la mayoría de los servidores web y en casi todos los sistemas operativos y plataformas sin costo alguno. PHP se encuentra instalado en más de 20 millones de sitios web y en un millón de servidores, aunque el número de sitios en PHP ha compartido algo de su preponderante sitio con otros nuevos lenguajes no tan poderosos desde agosto de 2005. Este mismo sitio web de Wikipedia está desarrollado en PHP. Es también el módulo Apache más popular entre las computadoras que utilizan Apache como servidor web. La más reciente versión principal del PHP fue la versión 5.2.8 del 08 de diciembre de 2008.

PHP está instalado en todos los servidores.

El 13 de julio de 2004, fue lanzado PHP 5, utilizando el motor Zend Engine 2.0 (o Zend Engine 2). La versión más reciente de PHP es la 5.2.8 (8 de diciembre de 2008), que incluye todas las ventajas que provee el nuevo Zend Engine 2 como:

  • Mejor soporte para la Programación Orientada a Objetos, que en versiones anteriores era extremadamente rudimentario, con PHP Data Objects.
  • Mejoras de rendimiento.
  • Mejor soporte para MySQL con extensión completamente reescrita.
  • Mejor soporte a XML ( XPath, DOM, etc. ).
  • Soporte nativo para SQLite.
  • Soporte integrado para SOAP.
  • Iteradores de datos.
  • Manejo de excepciones.
  • Aloja ya tu web con nosotros, consulta nuestros planes de hosting web

Configurar acceso remoto a tu base de datos mysql

Todos los planes de hosting incluyen Phpmyadmin para gestionar las bases de datos de forma cómoda y sencilla. Todas las operaciones que necesites hacer sobre la base de datos, se pueden realizar desde la propia web , incluso operaciones avanzadas o consultas con código SQL.

Sin embargo, en algunas ocasiones es posible que prefieras conectar a tu base de datos con una aplicación externa, para realizar control de stocks en tiempo real o cualquier otro tipo de programación a medida.

El primer paso para poder conectar a una base de datos desde fuera del servidor, es dar permisos a una dirección IP en concreto o a todas:

  • Si tienes una dirección IP dinámica, cambiará cada cierto tiempo, por lo que no te resultará cómodo. Puedes contratar una dirección IP fija con tu proveedor de Internet o dar acceso a todas las IPs con el símbolo modificador %
  • Exponer tu base de datos a cualquier IP, la hace más vulnerable frente a ataques de fuerza bruta.

¿Cómo autorizar el acceso remoto a una base de datos?

Entra el panel de control > Administrador de Cuenta > Administración de MySQL

Haz click en el nombre de la base de datos en la que quieras autorizar el acceso remoto.

Añade la dirección IP que quieras autorizar o el comodín % para que cualquier dirección IP pueda conectar en el campo > Host de acceso > Añadir Nuevo.

3 recomendaciones para tener en cuenta trabajando con una base de datos en modo remoto

  1. Trabajar en modo remoto con una aplicación especializada puede ser más cómodo, pero también es más peligroso y se pueden realizar borrados accidentales. Realiza copias de seguridad de manera periódica antes de trabajar sobre una base de datos.
  2. Asegúrate de que estás trabajando en la base de datos correcta antes de cualquier cambio. Utiliza nombres descriptivos para el contenido de la base.
  3. Cuando hayas terminado, quita el acceso remoto para aumentar la seguridad de tu base de datos.

Hosting Joomla

Joomla! es un sistema de gestión de contenidos que permite editar el contenido de un sitio web de manera sencilla. La gran cantidad de extensiones existentes programadas por la comunidad de usuarios hace que aumenten las posibilidades de Joomla con nuevas características y se integren fácilmente:

Existen cientos de extensiones disponibles y con diversas funcionalidades como por ejemplo:

  • Generadores de Formularios Dinámicos
  • Directorios de Empresas u Organizaciones
  • Gestores de Documentos
  • Galerías de Imágenes Multimedia
  • Motores de Comercio y Venta Electrónica
  • Software de Foros y Chats
  • Calendarios
  • Software para Blogs
  • Servicios de Directorio
  • Boletines de Noticias
  • Herramientas de Registro de Datos
  • Sistemas de Publicación de Anuncios
  • Servicios de Suscripción
  • Consulta los planes de Hosting Web hoy mismo por sólo 35€ al año

Tu web más rápida con gzip

Aumenta la velocidad de carga de tu web hasta en un 75%, simplemente activando una opción en tu panel de control.

Todos nuestros planes de hosting incluyen de serie múltiples mejoras, una de ellas es la compresión mediante gzip.

Es un mecanismo ampliamente soportado por todos los navegadores (publicado en la RFC 1951) desde hace años y por supuesto por los servidores web. Se basa en el algoritmo deflate y permite compresión de un archivo cada vez (es decir, no es como el zip o el rar que pueden almacenar varios archivos y carpetas) y en entornos unix es ampliamente usado en los archivos .tar.gz (tar almacena la estructura sin comprimir y gzip comprime el resultado).

Es muy efectivo para la compresión de HTML (.htm, .html), Javascript (.js), CSS (.css) y por supuesto archivos dinámicos resultado de todo tipo de entornos (.aspx, .asp, .php, .py…).

Honesting.es carga un 72% más rápido

A continuación, un vídeo de cómo funciona gzip explicado por Google.

Softaculous

Softaculous es un auto-instalador de scripts o aplicaciones webs libres y gratuitas en su mayoría, que te facilita el día a día en la puesta en marcha y actualización de tu web. Puedes montar tu propio clon de Youtube, Facebook, blogs, tiendas de comercio electrónico, portales… ¡un nuevo mundo de posibilidades a tu alcance! y por supuesto sin coste añadido.

  • Compatibilidad con antiguas instalaciones de Fantastico De Luxe
  • Más de 374 scripts disponibles
  • Actualizaciones más rápidas
  • Instalación en 1 único paso
  • Sistema de votación y comentarios para añadir nuevos scripts
  • Instalador personalizado de scripts
  • Y muchas más opciones, entra en tu panel de control (cPanel) y dale un vistazo

Además, ahora mantenemos actualizado tu gestor de contenidos de forma automática y sin coste.

Awstats, estadísticas gratuitas

AWStats es uno de los analizadores de archivos log para estadísticas web avanzadas más populares del mundo. Es capaz de generar informes rápidos y exactos sobre su sitio web ofreciendo valiosa información sobre sus visitas. Está disponible en 6 idiomas entre los que se encuentra el español, y activado por defecto en tu plan de alojamiento de Honesting.

 

/imagenes/capturas/awstats-honesting.png

 

Extraerá toda la información del registro de su servidor y generara un completo informe incluyendo estadísticas horarias, diarias, semanales y mensuales. Podrá conocer el origen de sus visitas, a través de que motores de búsqueda accedieron a su sitio web, que palabras usaron en la búsqueda. Toda la información sobre los usuarios, procedencia por dominios, navegadores usados, sistemas operativos. Las páginas más visitadas, los archivos servidos y reporte de errores producidos.
AWStats te muestra la siguiente información:

  • Número de visitas y número de visitantes únicos
  • Duración de las visitas y últimas visitas Usuarios autenticados y últimos usuarios autenticados
  • Días de la semana y horas de mayor tráfico (páginas, hits, KB por cada hora y día de la semana)
  • Dominios/países de Host visitantes Lista de Hosts, últimas visitas y lista de IP no resueltas
  • Páginas más vistas, páginas de entrada y salida
  • Tipos de archivo
  • Estadísticas de compresión web (para mod_gzip o mod_deflate)
  • Navegadores utilizados (páginas, hits, KB por cada usuario, versión, etc.)
  • Sistemas Operativos usados Visitas de robots (307 robots detectados)
  • Buscadores, palabras clave, frases clave usadas para encontrar tu sitio
  • Errores HTTP
  • Otros reportes personalizados sobre URL, parámetros de URL, referidos
  • Cantidad de veces que tu sitio es añadido a Favoritos
  • Ratio de navegadores con soporte Java, Flash, RealG2 reader, Quicktime reader, WMA reader, PDF reader
  • Y mucho más

Error Cache/Lite en joomla

Según parece, tras la última actualización de php y mysql en todos los servidores, hay webs que estaban utilizando versiones antiguas de joomla que están dando el siguiente error:

Warning: Parameter 2 to frontpage() expected to be a reference, value given in /home/usuario/public_html/includes/Cache/Lite/Function.php on line 100

Según nos ha podido confirmar un usuario de honesting, la solución está explicada en el siguiente foro:

https://forum.joomla.org/viewtopic.php?t=450484

Si te encargas del mantenimiento de tu web, te recomendamos que te suscribas a los boletines oficiales del sistema que utilices, joomla, wordpress, etc, es la mejor forma de estar informado de las últimas novedades.

Si tienes contratado el mantenimiento de tu web con alguna empresa, contáctales para que actualicen el sistema gestor de contenidos.

Adiós Fantastico De Luxe, hola Softaculous

Softaculous es un autoinstalador de scripts con algunas mejoras frente a Fantástico De Luxe, por ejemplo las opciones que incluyen de cara a mantener los sistemas actualizados. Con Fantastico De Luxe ahora mismo tenemos el problema de que hay un cierto retraso de 1-2 semanas entre la versión oficial y la disponible. Con softaculous parece que es cuestión de días.

Las actualizaciones también parece que se pueden hacer de forma más sencilla, incluso forzar actualizaciones a los usuarios más despistados, lo que sin duda mejora la seguridad total del servidor.

Entre la lista de scripts hay algunos realmente novedosos, clones para montar tu propio Youtube, Twitter, varios frameworks, Calendarios y algo que será del agrado de muchos; varios sistemas de listas de correo. También un script curioso que te permite usar tu espacio de hosting como un reproductor musical, es decir, subes tu música al espacio y lo reproduces desde donde quieras.

Muchas opciones, muy buenos scripts, y un sistema estable ¿a qué esperamos entonces?

Viendo que los requisitos para su instalación son bastante estándar, lo hemos instalado a modo de prueba en el servidor uno, por lo que si estás alojado ahí ya puedes usarlo. Por el momento hasta su completa activación (que esperamos se haga mañana) faltan algunos scripts en la lista. En los próximos días pasaremos a instalarlo en el resto de servidores.

Un nuevo mundo de posibilidades a tu alcance ¡esperamos que lo disfrutes!