No, no hay una longitud que sea demasiado corta para ser explotable (al menos en algunas situaciones).
Un filtro de longitud no es una protección válida contra la inyección de SQL, y las declaraciones preparadas realmente son la única defensa adecuada.
Sin embargo, un filtro de longitud es una buena medida como defensa en profundidad (como lo son los filtros enteros, los filtros alfanum, etc.). Hay muchas situaciones en las que, por ejemplo, la entrada válida nunca podría estar por encima de los 30 caracteres, pero donde una explotación significativa requiere más. Debería (pero probablemente no) ir sin decir que cualquier filtrado como defensa en profundidad debe tener lugar en el lado del servidor, ya que cualquier cosa del lado del cliente simplemente se puede pasar por alto.
Anulación de restricción
Las cláusulas de restricción (por ejemplo, AND
/ OR
) se pueden omitir con dos caracteres, lo que puede causar un daño real, no solo una consulta fallida. El ejemplo más simple es un inicio de sesión (otros ejemplos serían la eliminación no autorizada de datos adicionales):
SELECT * FROM users WHERE userid = [id] AND password = [password]
Inyección:
id = 1#
password = wrong_password
Carga útil: 2 caracteres
DoS
Los ataques DoS requieren muy pocos caracteres. En un ejemplo de MySQL, se necesitan 7 para la llamada real + x para los segundos dados + lo que sea necesario para poder llamar a la función y corregir la consulta.
Ejemplo:
SELECT * FROM users WHERE userid = [id]
Inyección (esta es una inyección válida, una forma más larga sería 1 AND sleep(99)
):
sleep(99)
Carga útil: 9 caracteres
Datos de lectura
Si se muestran los datos, la longitud depende principalmente de la tabla y el nombre de la columna. Asumiré un recuento de columnas igual para todas las tablas (puede suceder, y guarda caracteres).
Ejemplo:
SELECT * FROM comments WHERE commentid = [id]
Inyección:
1 union select * from users
Carga útil: 27 caracteres.
Edición de datos
Las modificaciones no autorizadas de la base de datos también se pueden lograr con pocos caracteres.
Ejemplo:
UPDATE users SET password = '[password]' WHERE id = [id]
Inyección (en contraseña):
',isadmin='1
Carga útil: 12 caracteres
Una omisión de restricción también funcionaría (el resultado es que todas las contraseñas están ahora vacías *):
'#
Carga útil: 2 caracteres
* El ejemplo de contraseña se usa por simplicidad; Las contraseñas deben estar con hash haciendo que el ejemplo sea imposible. El ejemplo aún se aplica en todas las situaciones similares (actualizar un nombre de usuario, actualizar permisos, etc.)