Seguridad en php

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
¿Qué paso, así como las de los formularios y las funciones como "mail"?
Gracias por tu tiempo.

3 respuestas

Respuesta
1
1- Utiliza la clase phpmailer:
http://programacion.net/php/articulo/phpmailer/
2- Valida los datos con php.
3- Asegurate de quitar códigos html al momento de recibir las variables.
4- Cuando utilices variables que recibas, concatenalas en vez de usarlas dentro de una cadena. Ejemplo: "algo $var algo" <- asi no, asi si -> "algo ". $var."algo"
Hola. Muchas gracias por tu tiempo y tu ayuda. Ya solo me queda aplicar estas normas de seguridad en todos mis scripts, pero eso ya es cosa mía. Nuevamente muchas gracias. Te deseo suerte. Un Saludo.
Respuesta
1
Supongo que conoces la función mail de PHP, su sintaxis es parecida a la siguiente:
mail(recipiente, asunto, mensaje, cabeceras extras);
Lo que hace esta función es simplemente concatenar los datos y formar el mail, muchos spammers han usado vulnerabilidades en el envío de mails por medio de formularios para hacer envíos 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 deberíamos hacer es limitar el tamaño de este text, un correo electrónico no puede ni debe superar los 50 o 60 caracteres. Se que es una regla que parece estúpida 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:
[email protected]%0ACc:[email protected]%0ABcc:[email protected],[email protected]
Como te mencione al inicio la función mail solo concatena de manera ordenada la información. El (%0A) es el valor hexadecimal de un salto de linea.
Con esto el spammer obtendrá las cabeceras similares a la siguiente:
To: [email protected]
Subject: Asunto del mensaje
From: [email protected]
Cc:[email protected]
Bcc:[email protected],[email protected]
El ejemplo es el caso más básico de esta modalidad ya que a través 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 función que detecta que ene el campo no se haya escrito este tipo de código:
<?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 restricción de los campos de tu formulario y usas la función ValidarDatos, tu problema debe quedar resuelto.
La vulnerabilidad de tus formularios podría quedar resuelta si limitas el tamaño de los campos, incluso podrías implementar un script para que solo puedan escribir ciertos caracteres, no se en campos numéricos limitar la introducción a números, o en el nombre limitarlo a Letras. Te dejo un escript muy fácil 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... siéntete en confianza de preguntar otras cosas. Y ojala no hayas esperado mucho.
Hola. Perdona la demora en mi respuesta. Quiero agradecerte muchísimo tu tiempo y tu ayuda. Justamente estoy implementando este código 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.
Respuesta
1
Haria falta mas informacion. Basicamente seria asi:
1) Si sos el autor de los scripts, se trata de validar los datos ingresados en el form.
2) Si no tienes acceso al código fuente, hay que actualizar el php a la version más reciente que tiene solucionada la vulnerabilidad
http://www.dattatec.com/infocenter/faqs.php?View=entry&CategoryID=12&EntryID=45
Hola. Perdona por la demora en mi respuesta. Te agradezco mucho tu tiempo y disposición para apoyar a alguien inexperto. Voy a actualizar la versión de php que tengo ya que actualmente tengo la versión 4. Nuevamente gracias por tu valioso tiempo e invaluable ayuda. Saludos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas