martes, 31 de marzo de 2009

Cuando true es igual a false

Publicado a las 3:38 p.m.

Ayer una colega del laburo advirtió una "feature" interesante de MySQL: compara campos de texto contra valores numéricos, y falla miserablemente.

SELECT * FROM usuarios WHERE clave = 123456
codigousuario   usuario    clave
-----------------------------------
0 alina 123456a
¿Notaron el pequeño detalle? Para MySQL, 123456 es igual a 123456a.

Esto es gravísimo, y la causa sólo se me explica por una lamentable implementación de type casting. Evidentemente, en lugar de castear el valor del query a string y comparar string contra string, convierte el string a número y compara numéricamente. ¡Teh horror!

Esto también funciona:
SELECT 1 FROM usuarios WHERE 123456 = '000123456rfsfda'

Evidentemente el algoritmo debe convertir '000123456rfsfda' a número con la siguiente lógica: "saco la parte no numérica y los leading zeros: 0000123456 = 123456".

Y lo peor es que no pasa solo en MySQL. En PHP funciona igual:
$a = 'string';
$b = 0;

if ( $a == true && $b == false && $a == $b ) {
echo ( 'universe broken' );
}
$a es igual a true, $b es igual a false, y $a es igual a $b, por lo tanto, true es igual a false.

Y me pregunto en cuántos otros lugares sucederá lo mismo...
Solución temporal: asegurarse de entrecomillar los valores numéricos al comparar con string en MySQL, y usar el operador de comparación estricta ( === ) en PHP.

6 comentarios:

Federico dijo...
31/3/09 4:48 p.m.

Mmm... La verdad es que para mí no está mal. Fue la decisión de diseño que tomaron los desarolladores y así quedó! Eso sí... No te pongas a comparar números contra un campo varchar, hacete cargo! =P

Víctor Martínez dijo...
1/4/09 4:04 a.m.

Mhhhh... para eso son los changelogs y los release notes, el programador debe de aprovechar los "bugs", digo features de cada programa asumiendo que la sanitización de los valores la debe realizar nuestro programa, antes de ir a la DB y tambien conocer los limites de variables del lenguaje en el que programamos, por ejemplo eso en fortran ni seria posible pero quien escribe algo para web en estos dias en el confiable fortran.

Saludos.

Anita dijo...
1/4/09 3:55 p.m.

ah?

Carolain dijo...
3/4/09 6:59 p.m.

Por dios. No sé que es pior, que pase, ¡o que se lo justifique!
Yo sé que mis opinones pecan de extremistas o naif por venir del mundito feliz de Smalltalk, pero eso no está bien, lo mires por donde lo mires. Prefiero que reviente todo a la mierda a que me traiga fruta.

Pablo Borowicz dijo...
3/4/09 8:14 p.m.

¿Aguante Java?



...NOT

Anita dijo...
13/4/09 3:56 p.m.

Che ya sería hora de un update, no?