2009-10-23 19 views
53

Acabo de heredar un proyecto porque el último desarrollador se fue. El proyecto está basado en Code Igniter. Nunca he trabajado con Code Igniter antes.¿CodeIgniter previene automáticamente la inyección de SQL?

Me tomó un vistazo rápido al código y veo las llamadas bases de datos en el controlador como este:

$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 código de encendido desinfectar automáticamente estas consultas para prevenir la inyección sql?

+0

$ this-> db-> escape de() añadirá 'para las cadenas y escapar de todas las cotizaciones internas – Sanjeev

+0

página de comprobación roytuts.com/prevent-sql-injection- in-codeigniter/ – user3470953

Respuesta

63

CodeIgniter ESCAPE las variables que pasa cuando usa el método $this->db->query. Pero sólo cuando se pasa las variables que se une, he aquí un ejemplo:

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

Asimismo, recuerda que $_POST no deben prevalecer sobre los $this->input->post ya que lo que hace es comprobar si las variables existe para evitar errores.

+2

Creo que debería haber un segundo parámetro pasado a la función $ this-> input-> post() que básicamente indica si la entrada debe ser desinfectada o no. '$ dbResult = $ this-> db-> query (" SELECT * FROM usuarios WHERE username = '?' ", Array ($ this-> input-> post ('username', TRUE)));' – thephpx

+6

This ya no es válido. Ahora CodeIgniter escapa todo mientras use sus registros activos. –

+4

@David 天宇 Wong El hecho de que pueda usar Active Record como una solución * alternativa * realmente no impide que esta respuesta sea válida.El código en la pregunta no usa ninguna solución, por lo que está abierto a la inyección SQL. – IMSoP

4

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

+2

Creado como whatnow? 0_0 – KDawg

3

De acuerdo con los documentos de CI here, 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 he usado CI excepto para jugar con él, así que no estoy seguro de hasta qué punto confiaría en esto.

+2

El filtrado XSS y la inyección SQL no son lo mismo. No hay forma de escapar correctamente para SQL hasta que sepa a qué DB se está conectando (e, idealmente, su configuración regional actual), por lo que siempre será parte de una capa de BD, no de una capa de entrada. – IMSoP

13

No, el código que ha publicado es susceptible a la inyección de SQL. Debe usar query binding para construir sus consultas SQL. Si está utilizando la biblioteca IC DB, tendría que 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')); 
+4

ya no es cierto. –

+3

@David 天宇 Wong Por favor, aclare. ¿Está diciendo que CI escapará mágicamente de la entrada del código proporcionado (a pesar de no tener forma de saber que se está utilizando en un contexto SQL)? ¿O simplemente ese enlace de consulta ya no es el enfoque recomendado para este problema? – IMSoP

+1

hombre No tengo ni idea, publiqué esto hace un año y estoy usando django ahora. Pero admito que debería haber escrito por qué, ahora es demasiado tarde. –

2

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.

20

CodeIgniter proporciona algunas funciones de escape de cadena 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 presentarlo en su base de datos. CodeIgniter tiene tres métodos que le ayudan a hacer esto:

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

que había puesto los otros dos ejemplos, pero no quiere tomar toda la diversión de leer el manual.

+25

+1 por * "pero no me gustaría aprovechar al máximo la lectura del manual." * :) - una versión más dulce de RTFM .. – DMin

+0

Enlace roto: ¿Es este un reemplazo adecuado? http://ellislab.com/codeigniter/user-guide/database/queries.html – Prusprus

0

Puede ser complicado, pero conviene convertir sus consultas en registros activos.

estoy copiando desde el manual de CodeIgniter: "Más allá de la simplicidad, un gran beneficio para el uso de la Active Record características es que permite crear aplicaciones de bases de datos independientes, ya que la sintaxis de la consulta es generado 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 al igual que algunas personas ya se ha dicho, si el código es susceptible a la inyección de SQL

2

Uso registro activo para la seguridad y fácil codificación:

En lugar de:

$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'); 
0

Optimizado con un segundo parámetro param (TRUE) para fil XSS ter del nivel de entrada:

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

libraries/input.html

+0

Oh, señor, CI reinventó "citas mágicas"? Solo puede escapar de algo * para un contexto particular *, por lo que un "filtro XSS" global no tiene sentido. Sin embargo, su publicación también incluye una dinámica activa de estilo de registro 'where()', que probablemente * hará * el tipo correcto de escape. – IMSoP

+0

Tal vez un poco más que ol '"comillas mágicas", detalles en la clase "CI_Security", método "xss_clean", cf. [github] (https://github.com/EllisLab/CodeIgniter/blob/develop/system/core/Security.php) – BeKa

+0

Sí, estaba siendo un poco sarcástico, lo admito. Pero al igual que las citas mágicas, da una falsa confianza al tener algo que dice "hacer que la información sea segura", como lo demostró al mencionarlo en una publicación sobre inyección SQL, de la que no hará absolutamente nada (pero las citas mágicas intentaron, mal) – IMSoP

0

The docs de (al menos) 2.2 Estado, en una caja roja grande:

Aunque Active Record hará todo lo posible para adecuadamente cotización cualquier nombre de campo y tabla que alimente, 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.

Qué a este programador significa "no se basan en Active Record citar nada".

0

Usando función de escape a 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);?>