2009-02-13 7 views
8

¿Cuáles son las mejores formas de proteger contra la inyección de MySQL? ¿Cuáles son las debilidades que debería tener en cuenta?Protección de inyección MySQL y señales de vulnerabilidad usando PHP

Sé lo que es, pero realmente no tengo idea de lo vulnerable que podría ser. Aunque he tomado (lo que creo que es) pasos para protegerme a mí mismo y a mi base de datos.

¿Hay alguna forma segura de detener a alguien?

Por cierto ... Me escribe en PHP :)

Respuesta

1

Usted tiene que desinfectar todas las entradas. Cómo puede hacer esto depende del lenguaje de programación y/o del marco con el que está trabajando.

edición:

Si está utilizando la función php que busca es mysql_real_escape_string ($ cadena). Debe usar eso en todo lo que reciba del cliente que debe ir a la base de datos.

+0

disculpa por no estar clara ... uso PHP – johnnietheblack

+2

Nunca uses escapes a menos que no puedas evitarlo. Las funciones de escape pueden ser, y han sido, con errores, permitiendo que las inyecciones se deslicen. Es virtualmente imposible para los implementadores de DB cometer tal error con sentencias parametrizadas, por lo tanto, son más confiables. –

+1

Habiendo dicho eso, si DEBES usar escaping (es decir, mysqli_ * está fuera de discusión por cualquier razón), mysql_real_escape_string es de hecho el camino a seguir. –

1

Si no está utilizando un marco que le proporciona herramientas de desinfección PHP tiene un escaner de cuerda integrado, deberías comenzar allí. Puede encontrar la documentación en ese within the PHP docs for mysql real escape string. Si miras el ejemplo tres obtendrás una buena idea de lo básico que puedes seguir.

Otro método que sigo es asegurarme de lanzar las variables cuando corresponda. Por ejemplo, si estoy esperando entrada de un usuario a ser un número entero que voy a hacer lo siguiente:

$age = (int)$age; 

Además, si se supone una columna que limitarse a uno o dos valores (por ejemplo, una columna de género) asegúrese de aplicar eso en su PHP antes de ponerlo en la base de datos.

0

Un signo de que podría tener un problema sería tomar la entrada del usuario directamente y ponerlo en su comando SQL.

Por ejemplo, puede pedirles su nombre de usuario. Si lo toma y simplemente dice

"Seleccione * De los usuarios Donde Nombre de usuario = '$ NOMBRE DE USUARIO';"

El usuario podría agregar "JOE", colocar tabla ... "y así sucesivamente.

en Perl se puede decir algo como

my $sth2 = $dbh->prepare("Insert Into HostList (HostName,PollTime,Status) values (?,?,?);"); 
$sth2->execute($Hostname,$myDate,$Status); 

El método de ejecución sería entonces buscar hazañas como la de arriba y escapar correctamente.

0

Utilizo esta función PHP en todas las entradas antes de intentar usarlo en cualquier código (consulta MySQL, visualización de datos, etc.). Probablemente no esté completo, pero debería detener todos los intentos básicos de hackear el sistema:

//$linkID is the link ID of the connection to the MySQL database 
function clean_input($input) 
{ 
    GLOBAL $linkID; 
    if(get_magic_quotes_gpc()) 
    { 
     //Remove slashes that were used to escape characters in post. 
     $input = stripslashes($input); 
    } 
    //Remove ALL HTML tags to prevent XSS and abuse of the system. 
    $input = strip_tags($input); 
    //Escape the string for insertion into a MySQL query, and return it. 
    return mysql_real_escape_string($input,$linkID); 
} 
8

¡Confíe en nadie!

Desinfecte todas las entradas - filter_var() o expresiones regulares o in_array() de valores válidos o una estrategia mixta según el tipo de datos.

"Entrada" significa cualquier fuente de entrada que no controle directamente, ¡no solo formularios!

Desinfecte cualquier cosa que regrese de $_GET, $_POST, $_SESSION, $_COOKIE - cualquier cosa que pudiera tener alguna posibilidad de ser contaminada.

Y

Uso prepara declaraciones

+0

$ _SESSION? ¿No se almacenan, escriben y leen esos datos en el servidor? –

+2

Sí. Y muchos sitios están en servidores compartidos alojados ... no confíes en nadie. – PartialOrder

1

Esto puede parecer de sentido común, pero se tropezó en ella durante un tiempo.

Hay una diferencia entre codificaciónhtmlentities() y escaparmysql_real_escape_string(). Estaba pensando en ellos como bastante intercambiables. Sin embargo, no ... como el sentido común te dirá. :) Por lo general, lo mejor es aplicarlos, como primer codificar, luego escapar.

Luego, cuando extraiga los datos, invierta el proceso, desactive (si es necesario) y luego descogne. Tenga en cuenta que ser específico en la forma en que se realizan (e invierten) los pasos ahorrará muchos dolores de cabeza y problemas de doble escape.

Cuestiones relacionadas