Inicio > PHP > holagabito > Seguridad en php

Seguridad en php

Experto:
Usuario:
Fecha: 04/07/2006
Valoración: Categoría: PHP
28/06/2006
carlosgh76, usuario preguntando en PHP
Usuario
Hola. Espero puedas ayudarme. Mi servidor de correo está siendo usado para

enviar correo no deseado (spam). La falla de seguridad son mis programas en

php, ya que estos tienen serias fallas de seguridad y no se formularon

políticas de seguridad al desarrollarlos. Por supuesto que me gustaría mucho

saber más acerca de qué hacen exactamente estas personas, pero por el

momento me apremia mucho más saber cómo solucionar mi problema. ¿Qué

funciones de php debo usar para evitar la vulnerabilidad de las variables

que paso, así como las de los formualrios y las funciones como "mail"?

Gracias por tu tiempo.
29/06/2006
carlosgh76, experto respondiendo en PHP
Experto
Supongo que conoces la funcion mail de PHP, su sintaxis es parecida a la siguiente:

mail(recipiente, asunto, mensaje, cabeceras extras);

Lo que hace esta funcion es simplemente concatenar los datos y formar el mail, muchos spammers han usado vulnerabilidades en el envio de mails por medio de formularios para hacer envios masivos.

Regularmente nosotros como programadores abrimos los campos de una manera desconsiderada

<input name="email" type="text" value="Ingrese su e-mail aqui" />

Lo primero que deberiamos hacer es limitar el tamaño de este text, un correo electronico no puede ni debe superar los 50 o 60 caracteres. Se que es una regla que parece estupida porque puede haber personas que tenga una cuenta de correo enorme pero limitar el tamaño de los campos nos ayudara a prevenir cosas que no queremos que sucedan como un ataque.

Lo que hacen los spammers es incluir una cadena similar a la siguiente:

spammer@anonimo.com%0ACc:email@victima1.com%0ABcc:email@victima2.com,email@victima3.com

Como te mencione al inicio la funcion mail solo concatena de manera ordenada la informacion. El (%0A) es el valor hexadecimal de un salto de linea.

con esto el spammer obtendra las cabeceras similares a la siguiente:
To: recipient@midominio.com
Subject: Asunto del mensaje
From: spammer@anonimo.com
Cc:email@victima1.com
Bcc:email@victima2.com,email@victima3.com

El ejemplo es el caso más básico de esta modalidad ya que a traves de las cabeceras se puede incluso modificar el asunto y hasta el mensaje en si mismo hasta el punto de poder enviar mensajes con contenido html.

Te copio una funcion que detecta que ene el campo no se haya escrito este tipo de codigo:

<?php
function ValidarDatos($campo){
//Array con las posibles cabeceras a utilizar por un spammer
$badHeads = array("Content-Type:",
"MIME-Version:",
"Content-Transfer-Encoding:",
"Return-path:",
"Subject:",
"From:",
"Envelope-to:",
"To:",
"bcc:",
"cc:");

//Comprobamos que entre los datos no se encuentre alguna de
//las cadenas del array. Si se encuentra alguna cadena se
//dirige a una página de Forbidden
foreach($badHeads as $valor){
if(strpos(strtolower($campo), strtolower($valor)) !== false){
header("HTTP/1.0 403 Forbidden");
exit;
}
}
}

//Ejemplo de llamadas a la funcion
ValidarDatos($_POST['email']);
ValidarDatos($_POST['asunto']);
ValidarDatos($_POST['mensaje']);
?>

Si implementas la restriccion de los campos de tu formulario y usas la funcion ValidarDatos, tu problema debe quedar resuelto.

La vulnerabilidad de tus formularios podria quedar resuelta si limitas el tamaño de los campos, incluso podrias implementar un script para que solo puedan escribir ciertos caracteres, no se en campos numericos limitar la introduccion a numeros, o en el nombre limitarlo a Letras. Te dejo un escript muy facil de personalizar en el cual puedes definir que esta o no esta permitido.

este es el javascript:

function letrasynumeros(myfield, e, dec) {
var key; var keychar;
if (window.event) key = window.event.keyCode; else if (e) key = e.which;else return true; keychar = String.fromCharCode(key);
// control keys
if ((key==null) || (key==0) || (key==8) || (key==9) || (key==13) || (key==27) ) return true;
// numbers
else if ((("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ").indexOf(keychar) > -1)) return true;
// decimalpoint jump
else if (dec && (keychar == ".")) { myfield.form.elements[dec].focus(); return false; }
else return false; }


y asi se llama en los campos:

<input name="usuario" type="text" class="white" id="usuario" maxlength="12" onKeyPress="return letrasynumeros(this, event);"/>


la cadena : 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ es la que me especifica que caracteres estoy dispuesto a aceptar en el campo.

Ojala y te sirva... sientete en confianza de preguntar otras cosas. Y ojala no hayas esperado mucho.
29/06/2006
carlosgh76, experto respondiendo en PHP
Experto
Supongo que conoces la funcion mail de PHP, su sintaxis es parecida a la siguiente:

mail(recipiente, asunto, mensaje, cabeceras extras);

Lo que hace esta funcion es simplemente concatenar los datos y formar el mail, muchos spammers han usado vulnerabilidades en el envio de mails por medio de formularios para hacer envios masivos.

Regularmente nosotros como programadores abrimos los campos de una manera desconsiderada

<input name="email" type="text" value="Ingrese su e-mail aqui" />

Lo primero que deberiamos hacer es limitar el tamaño de este text, un correo electronico no puede ni debe superar los 50 o 60 caracteres. Se que es una regla que parece estupida porque puede haber personas que tenga una cuenta de correo enorme pero limitar el tamaño de los campos nos ayudara a prevenir cosas que no queremos que sucedan como un ataque.

Lo que hacen los spammers es incluir una cadena similar a la siguiente:

spammer@anonimo.com%0ACc:email@victima1.com%0ABcc:email@victima2.com,email@victima3.com

Como te mencione al inicio la funcion mail solo concatena de manera ordenada la informacion. El (%0A) es el valor hexadecimal de un salto de linea.

con esto el spammer obtendra las cabeceras similares a la siguiente:
To: recipient@midominio.com
Subject: Asunto del mensaje
From: spammer@anonimo.com
Cc:email@victima1.com
Bcc:email@victima2.com,email@victima3.com

El ejemplo es el caso más básico de esta modalidad ya que a traves de las cabeceras se puede incluso modificar el asunto y hasta el mensaje en si mismo hasta el punto de poder enviar mensajes con contenido html.

Te copio una funcion que detecta que ene el campo no se haya escrito este tipo de codigo:

<?php
function ValidarDatos($campo){
//Array con las posibles cabeceras a utilizar por un spammer
$badHeads = array("Content-Type:",
"MIME-Version:",
"Content-Transfer-Encoding:",
"Return-path:",
"Subject:",
"From:",
"Envelope-to:",
"To:",
"bcc:",
"cc:");

//Comprobamos que entre los datos no se encuentre alguna de
//las cadenas del array. Si se encuentra alguna cadena se
//dirige a una página de Forbidden
foreach($badHeads as $valor){
if(strpos(strtolower($campo), strtolower($valor)) !== false){
header("HTTP/1.0 403 Forbidden");
exit;
}
}
}

//Ejemplo de llamadas a la funcion
ValidarDatos($_POST['email']);
ValidarDatos($_POST['asunto']);
ValidarDatos($_POST['mensaje']);
?>

Si implementas la restriccion de los campos de tu formulario y usas la funcion ValidarDatos, tu problema debe quedar resuelto.

La vulnerabilidad de tus formularios podria quedar resuelta si limitas el tamaño de los campos, incluso podrias implementar un script para que solo puedan escribir ciertos caracteres, no se en campos numericos limitar la introduccion a numeros, o en el nombre limitarlo a Letras. Te dejo un escript muy facil de personalizar en el cual puedes definir que esta o no esta permitido.

este es el javascript:

function letrasynumeros(myfield, e, dec) {
var key; var keychar;
if (window.event) key = window.event.keyCode; else if (e) key = e.which;else return true; keychar = String.fromCharCode(key);
// control keys
if ((key==null) || (key==0) || (key==8) || (key==9) || (key==13) || (key==27) ) return true;
// numbers
else if ((("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ").indexOf(keychar) > -1)) return true;
// decimalpoint jump
else if (dec && (keychar == ".")) { myfield.form.elements[dec].focus(); return false; }
else return false; }


y asi se llama en los campos:

<input name="usuario" type="text" class="white" id="usuario" maxlength="12" onKeyPress="return letrasynumeros(this, event);"/>


la cadena : 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ es la que me especifica que caracteres estoy dispuesto a aceptar en el campo.

Ojala y te sirva... sientete en confianza de preguntar otras cosas. Y ojala no hayas esperado mucho.
04/07/2006
carlosgh76, usuario preguntando en PHP
Usuario
Hola. Perdona la demora en mi respuesta. Quiero agradecerte muchisimo tu tiempo y tu ayuda. Justamente estoy implementando este codigo en los lugares donde tengo formularios para asegurar los datos que entran y evitar los ataques. Adicionalmente quiero agradecerte los tips de como operan estos ataques. Nuevamente muchas gracias port tu valioso tiempo para apoyar a un inexperto. Te deseo mucha suerte.
Más opciones
Enlaces patrocinados