Desinfecte el formulario de contacto sin mysql_real_escape_string

Normalmente uso esta función para desinfectar las entradas de mi formulario antes de almacenarlas en mi base de datos:

//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 había dado cuenta de que mysql_real_escape_string requería una conexión a la base de datos, ya que solo la había usado cuando limpiaba los datos antes de almacenarlos en la base de datos.

Intenté usar 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 bash 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 aún es necesario sanear estos datos?

use filter_var()

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

como si quieres desinfectar un correo electrónico:

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

mensajear

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

es enogth

El objective 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.

Use una función de desinfección adecuada a los caracteres especiales que necesita evitar. Lo ideal es no despojar de algo que no cause daño.

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

mysql_real_escape_string no “desinfectar” nada. Es meramente delimitadores de escape y nada más. Solo para evitar errores de syntax si tiene un delimitador en sus datos:

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

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

Por lo tanto, no tiene sentido hacer solo mysql_real_escape_string sin tener comillas alrededor. mysql_real_escape_string debería ser usado
a) solo cosas como recorte o barras de tabs no tiene nada que hacer aquí
b) justo antes de la composición 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 necesita ningún desinfectante si lo envía como texto sin formato. La única precaución que debe tomar es contra la inyección de correo
No es un gran problema sin embargo. 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 estás a salvo

(Soy nuevo en stackoverflow así que estoy haciendo esto de la manera incorrecta / haciendo un mal trabajo con el diseño de mi respuesta, no dude en hacérmelo saber).

Corrígeme si me equivoco, ya que también estoy lidiando con el mismo problema en este momento, pero no creo que la respuesta aceptada usando filter_var sea suficiente ya que los atacantes podrían eludir esto usando unicode.

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

Esto no se eliminaría de la cadena y luego se reemplazaría por “Bcc:”.

Esta es mi solución, pero puede haber una mejor manera. 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);