2011-11-04 32 views
11

Estoy compilando una aplicación Codeigniter y estoy haciendo todo lo posible para evitar las inyecciones de SQL. Estoy usando el método Active Record para construir todas mis consultas. Sé que Active Record desinfecta automáticamente la entrada, pero me pregunto ¿en qué medida? ¿Simplemente escapa de todas las citas, o hace más? ¿Qué pasa con la prevención de inyecciones SQL ofuscadas u otros tipos más avanzados?¿cómo funciona codeigniter para desinfectar las entradas?

Básicamente, estoy buscando una explicación en profundidad de cómo CI desinfecta los datos. ¿Nadie sabe?

+4

¿Has considerado mirar el código de CI? – Beat

+0

Mucha información: http://www.google.com.ng/search?gcx=c&sourceid=chrome&ie=UTF-8&q=codeigniter+sanitize+inputs%3F – Mob

+1

PDO ¿Alguien? http://www.php.net/pdo –

Respuesta

9

Exactamente como esto (para el conductor de MySQL):

  • Tries mysql_real_escape_string() (este será el caso del 99% de las veces)
  • cae de nuevo a mysql_escape_string()
  • cae de nuevo a addslashes()
  • escapa manualmente % y _ en LIKE de condiciones a través str_replace()

https://github.com/EllisLab/CodeIgniter/blob/develop/system/database/drivers/mysql/mysql_driver.php#L294

/** 
* Escape String 
* 
* @access public 
* @param string 
* @param bool whether or not the string will be used in a LIKE condition 
* @return string 
*/ 
function escape_str($str, $like = FALSE) 
{ 
    if (is_array($str)) 
    { 
     foreach ($str as $key => $val) 
     { 
      $str[$key] = $this->escape_str($val, $like); 
     } 

     return $str; 
    } 

    if (function_exists('mysql_real_escape_string') AND is_resource($this->conn_id)) 
    { 
     $str = mysql_real_escape_string($str, $this->conn_id); 
    } 
    elseif (function_exists('mysql_escape_string')) 
    { 
     $str = mysql_escape_string($str); 
    } 
    else 
    { 
     $str = addslashes($str); 
    } 

    // escape LIKE condition wildcards 
    if ($like === TRUE) 
    { 
     $str = str_replace(array('%', '_'), array('\\%', '\\_'), $str); 
    } 

    return $str; 
} 

Nota que esto es simplemente escapando personajes tan consultas MySQL no se romperán o hacer algo inesperado, y sólo se utiliza en el contexto de una base de datos consulta para garantizar la sintaxis correcta en función de lo que le pase.

No hay magia que hace que todos los datos seguros para cualquier contexto (como HTML, CSV o XML de salida), y sólo en caso de que estabas pensando en esto: xss_clean() no es una talla única para todos solución ni es 100% a prueba de balas, a veces es bastante inapropiado. La clase Active Record hace que la consulta se escape automáticamente, pero para todo lo demás debería escaparse/desinfectar datos manualmente de la manera correcta para el contexto dado, con su salida, no su entrada.

+0

No estoy del todo seguro de lo que quiere decir al desinfectar mi salida en lugar de la entrada. Creo que entiendo que si intento evitar ataques XSS, ¿pero qué ocurre si estoy construyendo una consulta mysql utilizando la clase de registro activo? ¿A que podría parecerse? – Erreth

+0

Lo que arroje en la clase AR es en última instancia tan seguro como 'mysql_real_escape_string', con la seguridad adicional de' \ 'escaping \' 'tabla y nombres de bases de datos. No debería necesitar desinfectarlo para seguridad, solo para la validez (valores enteros, longitud máxima, formateo, etc.). Consulte http://stackoverflow.com/questions/4171115/is-mysql-real-scape-string-ough-to-anti-sql-injection/4171134#4171134, http://stackoverflow.com/questions/5288953/is -mysql-real-escape-string-broken –

1

Siempre puede ver la última consulta realizada mediante el método last_query().

$this->db->last_query()

Va a ver exactamente cómo se veía la consulta, para que pueda verificar si verificada apropiadamente.

3

Active Record solo escapa de los datos, nada más. La inyección SQL se previene escapando. Luego use la validación en los formularios con su clase de validación. Debería encargarse de sus problemas. Aquí está el enlace para los demás elementos de seguridad CodeIgniter:

CodeIgniter UserGuide Security

+0

Entiendo. Estoy usando la clase de validación de formularios un poco, pero creo que debería usarla en cada formulario que tengo. Definitivamente tendré que hacer una sanitización y validación más agresiva. ¡Gracias! – Erreth

Cuestiones relacionadas