2010-09-05 9 views
26

Tengo un formulario con muchas variables que luego envía un correo electrónico, en lugar de desinfectar cada valor de $_POST con filter_var($_POST['var'], FILTER_SANITIZE_STRING); Estaba buscando una pieza más simple de código. Se me ocurrió lo siguiente, que parece funcionar, ya que creo que la acción predeterminada es FILTER_SANITIZE_STRING, pero me preguntaba cuáles son las opiniones de las personas, y si esto no es una buena práctica, ¿podría decirme por qué? Los $_POST valores se insertan individualmente en nuevas variables, por lo que sólo estarían utilizando array_map justo en el inicio de desinfectar todo ...

$_POST = array_map('filter_var', $_POST); 

Gracias por sus respuestas, para darle un poco más de información, básicamente :

tengo 20-30 campos de entrada en una forma que están siendo capturados, los datos a continuación, se muestra al usuario comprobar su entrada, son desinfectados luego las variables, el usuario es enviado un correo electrónico y luego, finalmente, los detalles se ingresan en un db.

Actualmente estoy desinfectando utilizando la función anterior array_map, así como FILTER_SANITIZE_EMAIL en la dirección de correo electrónico antes de enviar un correo electrónico y luego escapar de la entrada utilizando mysql_real_escape_string() antes de insertar en el db. Sin entrar en declaraciones preparadas, etc. ¿Crees que debería estar haciendo algo adicionalmente? ¡gracias de nuevo!

+0

para desinfectar cadena, aquí está una función útil - http://stackoverflow.com/questions/3126072/what-are-the-best-php-input-sanitizing-functions/20403438#20403438 –

+0

posible duplicado de [PHP -anitiza los valores de un ar ray] (http://stackoverflow.com/questions/4861053/php-sanitize-values-of-a-array) – feeela

Respuesta

14

Depende de lo que se está utilizando.

Si lo está insertando en la base de datos, entonces mysql_real_escape_string() para cadenas entre comillas y tipo de fundición para números sería el camino a seguir, y las declaraciones idealmente preparadas, pero esa es una cuestión completamente diferente.

Si planea dar salida a los datos en la página web, entonces te recomiendo algo así como htmlspecialchars()

Si se desea usar la entrada del usuario como un argumento de la cáscara, entonces se usaría escapeshellarg()

Pasando a su pregunta sobre el envío de correos electrónicos. Bueno, lo siguiente debería ser suficiente:

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

Todo lo que hace es básicamente tirar etiquetas y codificar caracteres especiales.

+1

Buena respuesta. Añadiré que si va a permitir la entrada del usuario a su página web, considere usar strip_tags() para evitar que la gente agregue

4

No hay una forma correcta de realizar el saneamiento general. El método de saneamiento que necesita depende de lo que se haga con los datos.

Desinfecte los datos directamente antes de usarlos.

+0

gracias, me doy cuenta de esto, estoy tratando de lograr esto sin escribir un montón de código repetitivo ... – SirG

+0

@SirG: por todos los medios valida la entrada, pero solo debes aplicar transformaciones de sanitización a datos cuando ** deja ** PHP - y el método debe ser apropiado para donde van los datos (mysql_real_escape_string(), htmlentities(), urlencode(), base64) _encode(), escapeshellarg(), addslashes () .... etc todos ** diferentes ** cosas) – symcbean

+0

@symcbean, gracias por la respuesta, por lo que sería adecuado aplicar filter_var antes de enviar un correo electrónico a través de la función de correo de php? aclamaciones. – SirG

55

Si el tipo de cada una de sus variables de entrada es una cadena y que desea desinfectar todos a la vez, se puede utilizar:

// prevent XSS 
$_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING); 
$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING); 

Esto desinfectar su $ _GET y $ _POST matrices.

se ve aquí: PHP -Sanitize values of a array

0

Esto es lo que utilizo en todos mis proyectos:

function util_array_trim(array &$array, $filter = false) 
{ 
    array_walk_recursive($array, function (&$value) use ($filter) { 
     $value = trim($value); 
     if ($filter) { 
      $value = filter_var($value, FILTER_SANITIZE_STRING); 
     } 
    }); 

    return $array; 
} 

Permite recortar y desinfectar una matriz anidada de los datos publicados

Cuestiones relacionadas