Evitar sql injection y xss

Rodrigo Fuentealba darkprox en gmail.com
Lun Sep 24 23:22:03 CLT 2007


El 24/09/07, Aldrin Gonzalo Martoq Ahumada <amartoq en dcc.uchile.cl> escribió:
> On 9/24/07, Alvaro Herrera <alvherre en alvh.no-ip.org> wrote:
> > Ricardo Mun~oz A. escribió:
> > >>> $condiciones = array('nombres' => "LIKE %$nombres%", 'otro_campo' => "<>
> > >>> $valor", etc.);
> > >>> $this->set('clientes', $this->Cliente->findAll($condiciones));
> > >>> ...
> > > ADOdb para PHP permite hacer lo que mencionas.
> > > que tiene de feo el codigo de CakePHP? es solo tu gusto personal o tienes
> > > algo concreto que aportar?
>
> Lo que ví lo encontre pésimo. Me explico un poco más abajo.
>
> > El codigo de arriba tiene un SQL injection, no?
> > Mi problema con el codigo de arriba es que es un ORM,
>
> El problema con el código que miré de CakePHP es que "no es ni chicha'
> ni limona'. No es un ORM, no es una API a base de datos, no es una
> framework de templates... es una mezcla de todo eso y parece que mucho
> mas.

Eso se debe en gran parte a la pobreza de las clases de PHP 4, y que
es algo que varios criticamos. ADOdb es una de las cosas que hace
mejorcito su trabajo, pero aún siendo ordenados, cuesta un poco el no
mezclar las vistas con el modelo y se pierde el objetivo.

> No hay separación entre los parámetros y el código... para explicarme
> mejor, poner sentencias SQL como "LIKE %nombre%" entre los parámetros
> es la misma chicha que llamar a algo del estilo:
> "where nombre='" + mysql_sanitize("pepe") + "'";

Algo que últimamente recomiendo bastante para el manejo de datos es
Propel y Creole; ambos pueden trabajar juntos y están diseñados para
que así sea, pero de la manera en que se implementa, no mezclan el ORM
(Propel) con el manejo de SQL (Creole), a diferencia de ADOdb.

http://propel.phpdb.org
http://creole.phpdb.org

Si estás programando una sentencia SQL (bien porque es compleja y no
hay una forma viable de hacerlo con ORM, el único caso en que un
desarrollador PHP debería invertir tiempo en usar SQL), es bastante
válido (sobretodo considerando que PHP tiene el problema de no ser
fuertemente tipado) pasarle los parámetros de manera pseudotipada.
Comentario al margen: todos sabemos que al ser débilmente tipado, un
lenguaje pierde bastante su potencial (o permite hacer estupideces
como las que menciona Aldrin).

> 3. The Sanitize sql method
> The sql method escapes some special characters in a string with
> backslashes in order to prepare the string for use in a SQL statement.
> Comentario: Igual que en el caso HTML, no tiene sentido proveer de una
> API para escapar caracteres para la base de datos... al menos, no
> publicarla externamente.

Sanitizar no es extremadamente malo. Bien usado, puede ser bueno, pero
el sólo hecho de que el desarrollador deba sanitizar a mano cada uno
de sus datos ya es un riesgo.

Saludos,

-- 
Rodrigo Fuentealba



Más información sobre la lista de distribución Linux