2009-10-22 14 views
11

Estoy tratando de encontrar una manera de limpiar de manera efectiva todas las variables POST y GET con una sola función. Aquí está la propia función:

//clean the user's input 
function cleanInput($value, $link = '') 
{ 
    //if the variable is an array, recurse into it 
    if(is_array($value)) 
    { 
     //for each element in the array... 
     foreach($value as $key => $val) 
     { 
      //...clean the content of each variable in the array 
      $value[$key] = cleanInput($val); 
     } 

     //return clean array 
     return $value; 
    } 
    else 
    { 
     return mysql_real_escape_string(strip_tags(trim($value)), $link); 
    } 
} 

Y aquí está el código que lo llamaría:

//This stops SQL Injection in POST vars 
foreach ($_POST as $key => $value) 
{ 
    $_POST[$key] = cleanInput($value, $link); 
} 

//This stops SQL Injection in GET vars 
foreach ($_GET as $key => $value) 
{ 
    $_GET[$key] = cleanInput($value, $link); 
} 

Esto me parece que debería funcionar. Pero por alguna razón, no devolverá las matrices de algunas casillas de verificación que tengo en un formulario. Siguen saliendo en blanco.

He probado mi código sin la función anterior y funciona bien, solo quiero que se agregue un poco de seguridad.

Gracias!

+1

Debe evitar tratar de desinfectar todo en cada contexto. Eso solo obstaculiza su aplicación y hace que sea más difícil de asegurar cuando quiera recrear la funcionalidad perdida. Esta es una razón válida por la cual magic_quotes estaba deshabilitada. http://php.net/manual/en/security.magicquotes.php Algo que estás recreando en cierto sentido aquí. La entrada necesita desinfectarse para la aplicación a la que la envía. Si está enviando al navegador a través de HTTP, desinféctelo para HTTP y HTML. Si lo está enviando a SQL DB, desinféctelo para SQL. – bucabay

+0

lo siento, me refiero a obsoleto: http://php.net/manual/en/security.magicquotes.php – bucabay

+0

Gracias por la ayuda/consejo todos! Parece que necesito repensar mi proceso. :-) – tscully

Respuesta

6

Lo que está haciendo no es suficiente. Ver here.

22

Use filter_input si es posible (php5 +) Lo mantiene mucho más limpio y, por lo que yo sé, puede desinfectar y validar todo lo que pueda necesitar para usarlo.

Puede utilizar filter var array y, por ejemplo FILTER_SANITIZE_STRING bandera para filtrar toda la gama de post

filter_var_array($_POST, FILTER_SANITIZE_STRING) //just an example filter 

Hay un montón de diferentes opciones de filtro disponibles en las w3schools filter reference

+0

¡oh esto es asombroso!nunca he visto esto antes :) – Mickey

+1

este es el mejor método si tiene php5 – robjmills

6

para hacer la recursividad más elegante que usted podría utilizar algo como array_map por ejemplo:

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

uso del filtro var si es posible, aunque como este tipo de enfoques son generalmente malo, sólo un ejemplo, aunque;)

1

Esta es la forma incorrecta de realizar la limpieza de entrada.

Aplicando manta mysql escapando a absolutamente todo en $_POST y $_GET va a volver y morder, si aún desea utilizar los datos después de haber realizado una consulta de base de datos pero no desea los caracteres de escape en ahí.

Utilice consultas parametrizadas con mysqli o PDO y nunca necesitará usar mysql_real_escape_string().

+0

Aún peor si no tiene una conexión con la base de datos ya iniciada. – alex

+0

Tengo la conexión configurada justo encima de la llamada a la función, pero ustedes no necesitan ver lo que tengo allí. ;-) – tscully

+0

ver: http://php.net/manual/en/security.magicquotes.php – bucabay