2010-08-09 42 views
7

suelo utilizar esta función para desinfectar mis entradas de formulario antes de almacenarlos en mi base de datos:Desinfección formulario de contacto y sin mysql_real_escape_string

//Function to sanitize values received from the form. Prevents SQL injection 
function clean($str) { 
    $str = @trim($str); 
    if(get_magic_quotes_gpc()) { 
     $str = stripslashes($str); 
    } 
    return mysql_real_escape_string($str); 
} 

Hasta hoy no me daba cuenta de que mysql_real_escape_string requiere una conexión de base de datos como sólo he lo utilicé cuando limpié los datos antes de almacenarlos en la base de datos.

Intenté utilizar la función en un formulario de contacto y obtuve el error "No se pudo establecer un vínculo con el servidor". Podría conectarme a la base de datos, pero no es necesario porque simplemente intento desinfectar los datos antes de que se envíen a mi correo electrónico a través del formulario de contacto.

¿Cuál es la mejor manera de desinfectar los datos que no se almacenan en una base de datos mysql y estos datos aún deben ser desinfectados?

Respuesta

15

uso filter_var()

http://php.net/manual/en/function.filter-var.php

como si desea desinfectar un correo electrónico:

$_POST['email'] = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); 

al mensaje

$_POST['message'] = filter_var($_POST['message'], FILTER_SANITIZE_STRING); 

es enogth

+0

¿Qué filtros en particular quieres decir, por favor? hay tantos de ellos –

1

El objetivo de desinfectar los datos con mysql_real_escape_string es evitar la inyección de SQL. Si no estás usando SQL, ya eres inmune.

Los hombres no tienen cáncer de cuello uterino.

Utilice una función de desinfección adecuada para los caracteres especiales que debe evitar. Lo ideal es que no se despoje de algo que no cause daño.

+0

mysql_real_escape_string solo no ayuda nada –

-1

Todo el concepto es incorrecto. Esta función no ayuda con el correo electrónico ni siquiera para la base de datos.

mysql_real_escape_string no "desinfecte" nada. Es meramente delimitadores de escape y nada más. Sólo para evitar errores de sintaxis si tiene un delimitador en sus datos:

SELECT * FROM table WHERE name = 'it's me' # error! 

después de los datos que se escaparon, los datos se convierten en 'it\'s me' y no hay ningún error.
Por lo tanto, esta función solo funciona con consulta SQL y para datos, entre comillas solo.

Por lo tanto, no tiene sentido hacer solo mysql_real_escape_string sin tener comillas. mysql_real_escape_string debería usarse
a) solo. cosas como recorte o barras de separación no tiene nada que ver aquí
b) justo antes de la cadena de consulta y no en otra parte
c) solo con datos que se incluirán entre comillas.
d) todos los demás datos necesitan otras formas de desinfección

En cuanto al correo electrónico, no es necesario desinfectarlo, lo envía como texto sin formato. La única precaución que debe tomar es contra inyección de correo
No es un gran problema. Simplemente ponga la entrada del usuario en el cuerpo del mensaje solamente. no en el tema, hacia o desde o cualquier otro encabezado. Cuerpo del mensaje solamente Y que está a salvo

+0

¿Qué? Siempre use saneamiento. Nunca confíes en la entrada del usuario. Tal consejo asume que a) no hay forma de inyectar un encabezado diferente en el guión (si no está desinfectando la entrada, ¿cómo lo sabe con certeza?) Yb) que todos los clientes de correo harán lo correcto, incluso con un texto/encabezado simple. Realmente lo dudo. – Cfreak

+0

@Cfreak el único punto sensible aquí es sobre algunos clientes de correo impares. ¿Tienes uno como ejemplo? Pero "nunca confías en los comentarios del usuario", la oración sin sentido es realmente divertida. ¿Por qué no obtener experiencia antes de juzgar a los demás? –

-1

(soy nuevo en stackoverflow así que voy de este por el camino equivocado/haciendo un mal trabajo con el estilo de mi respuesta no dude en hacérmelo saber.)

Corrígeme si estoy equivocado ya que también estoy lidiando con el mismo problema ahora mismo, pero no creo que la respuesta aceptada usando filter_var sea suficiente ya que los atacantes podrían evitar esto usando unicode.

Ejemplo: "& # 66; & # 99; & # 99; & # 58;" (espacios agregados para que stackoverflow lo muestre correctamente)

Esto no se eliminará de la cadena, y luego se reemplazará por "Bcc:".

Esta es mi solución, pero puede haber una manera mejor. Si alguien sabe de uno, me encantaría escucharlo.

$string = str_replace("&", "(and)", $string); 
    $string = str_replace("#", "(num)", $string); 
    $string = str_replace(";", "(semi-colon)", $string); 
    $string = str_replace(":", "(colon)", $string); 
    $string = str_replace("@", "(at)", $string); 
    $string = str_replace("\\", "(backslash)", $string); 
    $string = filter_var($string, FILTER_SANITIZE_STRING); 
Cuestiones relacionadas