Pregunta

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.

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

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

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.

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

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

o llamadas como esta:

<*>

¿El iniciador de código desinfecta automáticamente estas consultas para evitar la inyección de SQL?

POST['user_name']."'");

o llamadas como esta:

<*>

¿El iniciador de código desinfecta automáticamente estas consultas para evitar la inyección de SQL?

¿Fue útil?

Solución

CodeIgniter ESCAPE las variables por las que pasa al usar el método $ this- > db- > query . Pero SOLO cuando pasa las variables como enlaces, aquí hay un ejemplo:

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

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

Otros consejos

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

Extracto de Manual de CI :

  

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 te ayudan a hacer esto:

     
      
  1. $ this- > db- > escape () Esta función determina el tipo de datos para que solo pueda escapar datos de cadenas. 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).")";
    
  2.   

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

No, el código que ha publicado es susceptible de inyección SQL. Debe utilizar enlace de consulta para construir sus consultas SQL. Si está utilizando la biblioteca de base de datos de CI, codificaría 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 saneará mágicamente las consultas que se han creado de esta manera.

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

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

Eso no escapa a nada. Es mejor cambiarlo a la sintaxis de enlace o a la sintaxis de registro activo

Debería usar $ this- > input- > post, enlace de consulta y registro activo para tener los datos más seguros y luego, probar la prueba de prueba para estar seguro.

Utilice el registro activo para una codificación más segura y segura:

En lugar de:

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

Utilice el registro activo para una codificación más segura y segura:

En lugar de:

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

Uso (mismo resultado):

<*>POST['user_name']."'");

Uso (mismo resultado):

<*>

Puede ser una molestia, pero debes convertir tus consultas en un registro activo.

Estoy copiando del manual de CodeIgniter: " Más allá de la simplicidad, una de las principales ventajas de usar las funciones de Registro activo es que le permite crear aplicaciones independientes de 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 han dicho, sí, este código es susceptible de inyección SQL

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

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

raries / input.html

The docs para (al menos) 2.2 estado, en un gran cuadro rojo:

  

Aunque Active Record hará todo lo posible para citar correctamente los nombres de los campos y tablas que lo alimenta, tenga en cuenta que NO está diseñado para funcionar con entradas de usuarios arbitrarias. NO lo alimente con datos de usuario no saneados.

Lo que para este programador significa " no confíe en Active Record para citar nada " ;.

Uso de 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);?>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top