cómo evitar la inyección sql en codeigniter


En CodeIgniter, ¿cómo puedo evitar la inyección sql? ¿Hay algún método para establecer en el archivo de configuración para evitar la inyección sql? Estoy usando este código para seleccionar valores:

$this->db->query("SELECT * FROM tablename WHERE var='$val1'");

Y esto para insertar valores:

$this->db->query("INSERT INTO  tablename (`var1`,`var2`) VALUES ('$val1','$val2')");

Otro método utilizado para insertar y seleccionar valores de la base de datos son los métodos insert() y get() de CodeIgniter. Es cualquier posibilidad de inyección sql durante el uso de funciones bulit-in de CodeIgniter

Author: Francisco Alvarado, 2011-05-02

6 answers

Los métodos de CodeIgniter Active Record escapan automáticamente las consultas para evitar la inyección sql.

$this->db->select('*')->from('tablename')->where('var', $val1);
$this->db->get();

O

$this->db->insert('tablename', array('var1'=>$val1, 'var2'=>$val2));

Si no desea utilizar Registros activos, puede usar enlaces de consulta para evitar la inyección.

$sql = 'SELECT * FROM tablename WHERE var = ?';
$this->db->query($sql, array($val1));

O para insertar puede utilizar el insert_string() método.

$sql = $this->db->insert_string('tablename', array('var1'=>$val1, 'var2'=>$val2));
$this->db->query($sql);

También Existe la escape() método si prefiere ejecutar sus propias consultas.

$val1 = $this->db->escape($val1);
$this->db->query("SELECT * FROM tablename WHERE var=$val1");
 48
Author: Rocket Hazmat,
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
2018-02-01 14:45:54

Puedes usar

$this->db->escape()

Método..

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

Aquí se enumeran otros métodos.

Http://codeigniter.com/user_guide/database/queries.html

 6
Author: Vamsi Krishna B,
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-05-02 13:08:21

Debe intentar evitar escribir sus consultas directamente en una cadena y luego pasarlas a la función de consulta. Una mejor opción sería utilizar la clase Active Record que construirá sus consultas para usted y escapará los valores. http://codeigniter.com/user_guide/database/active_record.html

Si desea evitar el uso de la clase Active Record por cualquier razón, puede ver la documentación de Codeigniter para la clase de base de datos que tiene un método de escape para escape de sus valores antes de pasarlos al método de consulta. http://www.codeignitor.com/user_guide/database/queries.html

Ben

 3
Author: Ben,
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-05-02 13:14:57

En CodeIgniter: Hay 2 acciones para evitar la inyección SQL. Para aquellos que son novedad en la programación web, otro tipo de agujero de seguridad en la programación web que puede ser fatal porque puede exponer su lado interno de la base de datos de la aplicación, es la inyección SQL.

Y afortunadamente de nuevo, Codeigniter tiene la capacidad de lidiar con ello. Pero desafortunadamente, muchos de CI programador colaboré (e incluso usted) hizo (o podría) olvidar estas dos acciones para evitar cualquier circunstancia de SQL inyección.

Se adhieren a la capacidad ActiveRecord La primera cosa es no en ninguna circunstancia tratar con la consulta de los datos mediante el uso de consulta completa como esta:

$this->db->query("select * from users where user=$user and password=$password")

No sabes qué es exactamente dentro de variable user o variable password variable cuando se trata de usuario que hará deliberadamente lo incorrecto. Incluso XSS sanitiser no tratará con alguien que ingrese una combinación de comilla, punto y coma o carácter de guión en él. Así que en este caso, usted necesita aprender esta cosa Registro activo porque tiene la capacidad de sanitiser de entrada dedicada a prevenir la inyección SQL. Y no te preocupes, es compatible con el tipo de encadenamiento de funciones como este:

$this->db->select('title')->from('mytable')->where('id', $id)->limit(10, 20);

$query = $this->db->get();

Pero recuerde, no funcionará si aún combina la función de consulta habitual (parcialmente) dentro de la función active record de esta manera:

$query = $this->db->where("title LIKE '%$input%'");

Que en realidad podría cambiarse así.

$query = $this->db->like("title", $input);

El punto es, usar cada bit de posibilidad del Registro Activo de CodeIgniter y no meterse con él.

Pero si eso no hay trabajo, hay una alternativa Si tiene una consulta muy larga y no se molesta en convertirla al estilo de Active Record, puede desinfectar su entrada manualmente usando esta función:

$sanitised_title = $this->db->escape($title);

/ / Para su uso dentro COMO consulta

$sanitised_title = $this->db->escape_like_str($title);

Y puede concatenar de forma segura la entrada sanitised/escaped dentro de su consulta.

 1
Author: user5751226,
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-01-06 08:36:48

Puede comprobar si var contiene solo letras de números, lo que significa que var mast está en el formato definido. antes de insertarlo en la consulta

 0
Author: Mark T,
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-05-02 13:05:13

Al aceptar el valor del lado del cliente, es mejor usar este código,

$client = $this->input->post('client',TRUE);

Al insertar mejor para usar el método de inserción de codeigniter,

$this->db->insert('tablename',$values);

Al usar este método codeingniter automáticamente hacemos todos los escapes por lo que no necesitamos hacer escape manual.

 0
Author: shihabudheen,
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
2012-09-18 13:35:13