Ver Mensaje Individual
  #2 (permalink)  
Antiguo 05/08/2011, 01:49
Henkka
 
Fecha de Ingreso: abril-2008
Ubicación: Santa Fe, Argentina
Mensajes: 41
Antigüedad: 16 años, 8 meses
Puntos: 14
Respuesta: si no es entero no funciona el script

Me imagino que GetSQLValueString() es una función que sirve para sanitizar las entradas.

Al no usarla para el INSERT INTO cotizacion_detail dejás esa parte vulnerable a inyecciones SQL.

Si en el formulario ingresases números, lo que le llega a MySQL es lo siguiente:

Código MySQL:
Ver original
  1. INSERT INTO cotizacion_detail VALUES (NULL, 3, 4, 5, 6);

Que es totalmente válido, en MySQL los integers no necesitan encerrarse entre comillas. Si descripcion fuese alfanumérica, llegaría

Código MySQL:
Ver original
  1. INSERT INTO cotizacion_detail VALUES (NULL, 3, 4, asd, 6);

Como no se puede dejar un literal sin comillas, no lo interpreta como un valor, sino como una columna de otro resultset (por si trabajases con SELECT anidados o uniones).

La respuesta es encerrar las variables con comillas simples en el código, pero esto sigue dejando el script vulnerable a inyecciones SQL, así que también las tendrías que pasar por tu función de sanitización.

Podrías considerar usar alguna capa de abstracción como PDO, que se encarga de ayudarte a preparar las consultas.

http://web2development.blogspot.com/2007/04/accesando-nuestra-base-de-datos-con-pdo.html



Para que entiendas mejor, acá te doy un ejemplo. Primero intento insertar foo sin comillas, y luego con

Código MySQL:
Ver original
  1. mysql> CREATE TABLE tablaejemplo (campo VARCHAR(5) NOT NULL);
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> INSERT INTO tablaejemplo VALUES (foo);
  5. ERROR 1054 (42S22): Unknown column 'foo' in 'field list'
  6.  
  7. mysql> SELECT * FROM tablaejemplo;
  8. Empty set (0.00 sec)
  9.  
  10. mysql> INSERT INTO tablaejemplo VALUES ('foo');
  11. Query OK, 1 row affected (0.00 sec)
  12.  
  13. mysql> SELECT * FROM tablaejemplo;
  14. +-------+
  15. | campo |
  16. +-------+
  17. | foo   |
  18. +-------+
  19. 1 row in set (0.00 sec)

Si el valor fuese numérico, funcionaría de ambas maneras

Código MySQL:
Ver original
  1. mysql> INSERT INTO tablaejemplo VALUES (1);
  2. Query OK, 1 row affected (0.00 sec)
  3.  
  4. mysql> SELECT * FROM tablaejemplo;
  5. +-------+
  6. | campo |
  7. +-------+
  8. | 1     |
  9. +-------+
  10. 1 row in set (0.00 sec)
  11.  
  12. mysql> INSERT INTO tablaejemplo VALUES ('7');
  13. Query OK, 1 row affected (0.00 sec)
  14.  
  15. mysql> SELECT * FROM tablaejemplo;
  16. +-------+
  17. | campo |
  18. +-------+
  19. | 1     |
  20. | 7     |
  21. +-------+
  22. 2 rows in set (0.00 sec)

Incluso si el tipo de datos fuese numérico, se le podría pasar un número en formato literal y MySQL lo convertiría al vuelo en numérico ('5' no es un número, es una letra; 5 si es un número)

Código MySQL:
Ver original
  1. mysql> ALTER TABLE tablaejemplo CHANGE campo campo INTEGER;
  2. Query OK, 0 rows affected (0.00 sec)
  3. Records: 0  Duplicates: 0  Warnings: 0
  4.  
  5. mysql> DESCRIBE tablaejemplo;
  6. +-------+---------+------+-----+---------+-------+
  7. | Field | Type    | Null | Key | Default | Extra |
  8. +-------+---------+------+-----+---------+-------+
  9. | campo | int(11) | YES  |     | NULL    |       |
  10. +-------+---------+------+-----+---------+-------+
  11. 1 row in set (0.00 sec)
  12.  
  13. mysql> INSERT INTO tablaejemplo VALUES (3);
  14. Query OK, 1 row affected (0.00 sec)
  15.  
  16. mysql> SELECT * FROM tablaejemplo;
  17. +-------+
  18. | campo |
  19. +-------+
  20. |     3 |
  21. +-------+
  22. 1 row in set (0.00 sec)
  23.  
  24. mysql> INSERT INTO tablaejemplo VALUES ('5');
  25. Query OK, 1 row affected (0.00 sec)
  26.  
  27. mysql> SELECT * FROM tablaejemplo;
  28. +-------+
  29. | campo |
  30. +-------+
  31. |     3 |
  32. |     5 |
  33. +-------+
  34. 2 rows in set (0.00 sec)

Última edición por Henkka; 05/08/2011 a las 01:59