Pregunta

En CodeIgniter, ¿cómo puedo evitar la inyección de SQL? ¿Hay algún método para establecer 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 es Codeigniter's insert() y get() métodos. Es cualquier posibilidad de inyección SQL mientras se usa las funciones de Bulit de Codeigniter

¿Fue útil?

Solución

Codeigniter's Registro activo Los métodos escapan automáticamente las consultas para usted, para evitar la inyección de 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 usar registros activos, puede usar enlaces de consulta para evitar contra la inyección.

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

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

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

También está el escape() Método si prefiere ejecutar sus propias consultas.

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

Otros consejos

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

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 usar la clase de registro activo que construirá sus consultas para usted y escapará de los valores. http://codeigniter.com/user_guide/database/active_record.html

Si desea evitar usar la clase de registro activo 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 escapar de sus valores antes de pasarlos al método de consulta. http://www.codeignitor.com/user_guide/database/queries.html

Ben

En CodeIgniter: hay 2 acciones para evitar la inyección de SQL. Para aquellos que son novedades 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 de SQL.

Y afortunadamente nuevamente, Codeigniter tiene capacidad para lidiar con eso. Pero desafortunadamente, muchos de los programadores de CI que colaboré (e incluso usted) olvidó (o podría) esta acción para evitar cualquier circunstancia de inyección SQL.

Quédate con la capacidad de Activerecord Lo primero es no hacerlo en ninguna circunstancia que se ocupe de consultar los datos utilizando una consulta completa como esta:

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

No sabes qué exactamente dentro $ usuario o $ contraseña variable cuando se trata del usuario que hará deliberadamente lo incorrecto. Incluso el sanitiser XSS no se ocupará de alguien que ingrese la combinación de cotización, semicolon o carácter de tablero en él. Entonces, en este caso, debe aprender esta cosa de registro activo porque tiene una capacidad de desanimador de entrada dedicada a prevenir la inyección de SQL. Y no se preocupe, admite un tipo de encadenamiento de funciones de esta manera:

$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 de registro activo como esta:

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

Que en realidad podría cambiarse así.

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

El punto es que use todas las posibilidades del registro activo de Codeigniter y no se lo meta.

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

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

// para usar el interior como consulta

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

Y puede concatenar de forma segura la entrada desinfectada/escapada dentro de su consulta.

Puede verificar si VAR contiene solo letras de números, lo que significa que Var Mast estará en el formato definido. Antes de insertarlo en la consulta

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);

Cuando se usa este método, CodeingNiter se escape automáticamente, por lo que no es necesario que escape el manual.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top