Cómo prevenir la inyección de SQL en PHP

Cómo prevenir la inyección de SQL en PHP

Este tutorial lo ayudará a prevenir inyección de SQL en PHP. En este tutorial primero, verifique un ejemplo básico del proceso de inyección de SQL. ¿Cómo pueden los usuarios robar datos de su sitio web utilizando la inyección SQL?? Este tutorial también incluye métodos para evitar la inyección de SQL utilizando los controladores PHP-MYSQLI y PHP-PDO.

Ejemplo de inyección SQL simple

Por ejemplo, tiene un sitio web para el banco. Ha proporcionado una interfaz web a los clientes bancarios para ver su número de cuenta y saldo. Su sitio web bancario utiliza URL como http: // ejemplo.com/get_account_details.php?cuenta_id = 102 Para obtener detalles de la base de datos.

Por ejemplo get_account_details.php tener código algo como a continuación.

$ AccountId = $ _get ['Account_id']; $ query = "Seleccione AccountNumber, saldo de cuentas donde cuentoid = $ AccountID";
12$ AccountId = $ _get ['Account_id']; $ query = "Seleccione AccountNumber, saldo de Cuentas donde AccountId = $ AccountId";

Los clientes se pasa a través de la cadena de consultas como cuenta_id. Como la URL anterior, si la ID de cuenta de un usuario 102 y pasó en la cadena de consulta. El script PHP creará una consulta como a continuación.

$ query = "Seleccione AccountNumber, saldo de cuentas donde AccountId = 102";
1$ query = "Seleccione AccountNumber, saldo de cuentas donde AccountId = 102";
Detalles obtenidos para una cuenta especificada.

Los detalles del número de contabilidad y el saldo se obtienen para AccountID 102 y se proporcionan a los clientes como se muestra en la captura de pantalla anterior.

Supongamos que otro escenario: un cliente más inteligente ha pasado Account_ID como 0 o 1 = 1 En la cadena de consulta. ¿Qué pasará ahora?? El script PHP creará una consulta como a continuación y se ejecutará en la base de datos.

$ query = "Seleccione AccountNumber, saldo de cuentas donde AccountId = 0 o 1 = 1";
1$ query = "Seleccione AccountNumber, saldo de cuentas donde AccountId = 0 o 1 = 1";
Detalles obtenidos para todas las cuentas

Mire la consulta creada por el script y el resultado devuelto por la base de datos. Puede ver que esta consulta devolvió todas las cuentas y el saldo disponible.

Esto se llama inyección SQL. Este es el escenario simple, puede haber una serie de métodos para hacer inyecciones SQL. El siguiente tutorial lo ayudará a evitar la inyección de SQL utilizando el controlador MySQLI PHP y el controlador PDO PDO.

#1. Uso del controlador PHP-MYSQLI

Puede usar declaraciones preparadas para el controlador PHP-MYSQLI para evitar este tipo de inyecciones SQL. Utilice el código PHP a continuación que evitará la inyección de SQL.

$ AccountId = $ _get ['Account_id']; if ($ stmt = $ mysqli-> preparar ('seleccione AccountNumber, saldo de cuentas donde AccountId = ?')) $ stmt-> bind_param ("S", $ AccountId); $ stmt-> ejecute (); $ result = $ stmt-> get_result (); while ($ row = $ result-> fetch_assoc ()) // haz algo aquí $ stmt-> search ();
12345678910111213141516$ AccountId = $ _get ['Account_id']; if ($ stmt = $ mysqli-> preparar ('seleccione AccountNumber, saldo de cuentas donde AccountId = ?')) $ stmt-> bind_param ("S", $ AccountId); $ stmt-> ejecute (); $ result = $ stmt-> get_result (); while ($ row = $ result-> fetch_assoc ()) // haz algo aquí $ stmt-> search ();

#2. Uso del controlador PHP-PDO

Puede usar declaraciones de preparación del controlador PHP-PDO para evitar este tipo de inyecciones SQL. Use el código PHP a continuación que se resolverá por encima de las inyecciones SQL.

$ AccountId = $ _get ['Account_id']; if ($ stmt = $ pdo-> preparar ('seleccione AccountNumber, saldo de cuentas donde cuentasiD =: cuenta')) $ stmt-> ejecute (array ('name' => $ name)); foreach ($ stmt as $ row) // haz algo aquí $ stmt-> cerrar ();
123456789101112$ AccountId = $ _get ['Account_id']; if ($ stmt = $ pdo-> preparar ('seleccione AccountNumber, saldo de cuentas donde cuentasiD =: cuenta')) $ stmt-> ejecute (array ('name' => $ name)); foreach ($ stmt as $ row) // haz algo aquí $ stmt-> cerrar ();