¿CodeIgniter previene automáticamente la inyección SQL?


Acabo de heredar un proyecto porque el último desarrollador se fue. El proyecto está construido a partir de Code Igniter. Nunca he trabajado con Code Igniter antes.

Eché un vistazo rápido al código y veo llamadas a la base de datos en el controlador de esta manera:

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$_POST['user_name']."'");

O llamadas como esta:

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$this->input->post('username')."'");

¿code igniter desinfecta automáticamente estas consultas para evitar la inyección sql?

Author: Abdulla Nilam, 2009-10-24

12 answers

CodeIgniter ESCAPA de las variables que pasa cuando se utiliza el método $this->db->query. Pero SOLO cuando pasas las variables como enlaces, aquí tienes un ejemplo:

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '?'", array($this->input->post('username')));

También recuerde que $_POST no debe preferirse a $this->input->post ya que lo que hace es comprobar si las variables existen para evitar errores.

 66
Author: MarioRicalde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-26 14:25:18

CodeIgniter proporciona algunas funciones de escape de cadenas en su capa de base de datos.

Extracto de CI Manual :

Es una muy buena práctica de seguridad para escapar de sus datos antes de enviarlos a su base de datos. CodeIgniter tiene tres métodos que te ayudan a hacer esto:

  1. $this - > db- > escape () Esta función determina el tipo de datos para que solo pueda escapar de los datos de cadena. También agrega automáticamente comillas simples alrededor los datos para que no tenga que:

    $sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
    

Publicaría los otros dos ejemplos, pero no me gustaría quitar toda la diversión de leer el manual.

 21
Author: John Himmelman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-13 18:49:00

No, el código que publicaste es susceptible a la inyección SQL. Necesita usar enlace de consulta para construir sus consultas SQL. Si está utilizando la biblioteca de la base de datos CI, debería codificarla algo como esto (ejemplo de la guía del usuario):

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";

$this->db->query($sql, array(3, 'live', 'Rick')); 
 13
Author: Funkatron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-25 04:14:25

No, CodeIgniter no desinfectará mágicamente las consultas que se hayan construido de esta manera.

 4
Author: Ben James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-23 20:49:29

De acuerdo con los documentos de CI aquí, los filtros del marco se PUBLICAN en la construcción del controlador. También opcionalmente hace el filtrado XSS llamando manualmente a la función o estableciendo una configuración global.

Nunca he usado CI tampoco excepto para jugar con él, así que no estoy seguro de hasta dónde confiaría en esto.

 3
Author: Josh Lindsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-23 20:54:35

Eso no escapa a nada. Es mejor cambiarlo a la sintaxis bind o a la sintaxis active record

 2
Author: Thorpe Obazee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-26 03:47:25

Debe usar this this->input->post, query binding y active record para tener los datos más seguros y luego, probar probar probar para estar seguro.

 2
Author: stef,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-26 09:46:09

Utilice active record para seguridad y codificación más fácil:

En lugar de:

  $dbResult = $this->db->query("SELECT * FROM users WHERE username'".$_POST['user_name']."'");

Use (mismo resultado):

$this->db->where('username',$this->input->post('user_name');
$dbResult = $this->db->get('users');
 2
Author: Rid Iculous,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-11 09:54:51

Puede ser un dolor, pero debe convertir sus consultas a active record.

Estoy copiando del manual de CodeIgniter: "Más allá de la simplicidad, un beneficio importante de usar las características Active Record es que le permite crear aplicaciones independientes de la base de datos, ya que la sintaxis de consulta es generada por cada adaptador de base de datos. También permite consultas más seguras, ya que los valores se escapan automáticamente por el sistema."

Y como algunas personas ya dijeron, sí esto el código es susceptible a la inyección SQL

 0
Author: VangelisB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-29 07:10:45

Optimizado con un segundo post param (TRUE) para filtrar XSS en el nivel de entrada:

$this->db->where('username',$this->input->post('user_name', TRUE);
$dbResult = $this->db->get('users');

Bibliotecas / entrada.html

 0
Author: BeKa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-04 17:54:59

Los documentos para (al menos) 2.2 estado, en un gran cuadro rojo:

Aunque Active Record hará todo lo posible para citar correctamente cualquier nombre de campo y tabla que le proporcione, tenga en cuenta que NO está diseñado para funcionar con entradas arbitrarias del usuario. NO lo alimentes con datos de usuario no desinfectados.

Que para este programador significa "no confíe en Active Record para citar nada".

 0
Author: Madbreaks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-07 22:17:38

Usando la función de escape para la inyección de CI

<?php $username = $this->input->post('username');
$query = 'SELECT * FROM subscribers_tbl WHERE user_name = '.$this->db->escape($email);
$this->db->query($query);?>
 0
Author: Akbor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-08 10:08:03