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

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

Eché un vistazo rápido al código y veo las 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')."'"); 

¿El encendedor de código automáticamente desinfecta estas consultas para prevenir la inyección de sql?

CodeIgniter ESCAPE las variables que pasa cuando usa el método de $this->db->query . Pero SOLAMENTE cuando pasas las variables como se une, aquí hay 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 más de $this->input->post ya que lo que hace es verificar si las variables existen para evitar errores.

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

Extracto del manual de IC :

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

  1. $ this-> db-> escape () Esta función determina el tipo de datos para que solo pueda escapar a los datos de cadena. También agrega automáticamente comillas simples alrededor de 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 sacar toda la diversión de leer el manual.

No, el código que publicaste es susceptible a la inyección de SQL. Debe usar el enlace de consulta para construir sus consultas SQL. Si está utilizando la biblioteca de CI DB, debería codificar 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')); 

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

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

Nunca utilicé CI, excepto para jugar con él, así que no estoy seguro de hasta qué punto confiaría en esto.

Eso no escapa nada. Será mejor que lo cambie a la syntax de enlace o la syntax de registro activo

Debe usar $ this-> input-> post, query binding y active record para tener los datos más seguros y luego aún, probar la prueba de prueba para estar seguro.

Utilice el registro activo para seguridad y una encoding más sencilla:

Más bien que:

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

Uso (mismo resultado):

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

Puede ser un problema, pero debe convertir sus consultas en registro activo.

Estoy copiando del manual de CodeIgniter: “Más allá de la simplicidad, una de las principales ventajas de utilizar las características de Active Record es que permite crear aplicaciones independientes de la base de datos, ya que cada adaptador de base de datos genera la syntax de la consulta. También permite consultas más seguras , ya que el sistema escapa automáticamente a los valores “.

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

Optimizado con un segundo parámetro de publicación (TRUE) para filtrar XSS en el nivel de entrada:

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

libraries / input.html

Los documentos para (al menos) 2.2 estado, en una gran caja roja:

Aunque Active Record hará todo lo posible para citar correctamente cualquier nombre de campo y tabla que usted le proporcione, tenga en cuenta que NO está diseñado para funcionar con la entrada arbitraria del usuario. NO lo alimente con datos de usuario no optimizados.

Lo que para este progtwigdor significa “no confíe en Active Record para citar nada “.

Usar la función de escape para inyectar CI

 input->post('username'); $query = 'SELECT * FROM subscribers_tbl WHERE user_name = '.$this->db->escape($email); $this->db->query($query);?>