Protegiendo consultas con "?"


-
Algunas vez has encontrado querys donde existen parámetros con el signo de cierre de interrogación (?)
Como por ejemplo:




select nombre from personas where estado = ?



¿Y no te has preguntado por qué? o la persona que lo hizo te dice: "es otra manera de hacer las cosas solamente"

Bueno, esto tiene que ver con temas de ataque de inyección SQL.


Según wikipedia, la inyección SQL es una vulnerabilidad informática en el nivel de la validación de las entradas a la base de datos de una aplicación

Para tenerlo más claro:

cadSQL = "SELECT id FROM usuario WHERE id=$txtUsuario AND contrasenia=$txtContra"

en este caso el atacante probará a introducir el siguiente texto en el campo de usuario y contraseña:

' or '1'='1

de esta forma, si la aplicación no hace la comprobación correspondiente, se ejecutará la siguiente consulta SQL:

cadSQL = "SELECT id FROM usuario WHERE id='' OR '1' = '1' AND contrasenia=" OR '1' = '1'

y puesto que '1' = '1' siempre será verdadero el atacante tendrá acceso a la web como si de un usuario registrado se tratara.


El uso de "?" está presente en varios controladores y frameworks:

Ejemplos:






# RAILS

name = params[:name]
# NO HACER ESTO!
pos = Order.find(:all,
:conditions => "name = '#{name}' and pay_type = 'po'" )

# EN VEZ DE ESO:
name = params[:name]
pos = Order.find(:all,
:conditions => ["name = ? and pay_type = 'po'" , name])






// Java - JDBC Driver
String selectStatement = "SELECT * FROM User WHERE userId = ? ";
PreparedStatement prepStmt = con.prepareStatement(selectStatement);
prepStmt.setString(1, userId);
ResultSet rs = prepStmt.executeQuery();



Fuentes: Agile Web Development with Rails, wikipedia, AjpdSoft

Comentarios