Laboratorio de Inyección SQL
Se ejecuta localmente en tu navegadorMira cómo la construcción insegura de SQL cambia una consulta y cómo la vinculación mantiene los valores como datos
Laboratorio educativo defensivo: las consultas solo se ejecutan sobre datos ficticios integrados en una base SQLite en memoria. No hay URL ni objetivo externo.
Entrada
Una sola sentencia SQL con {{value}} exactamente una vez donde va el valor del usuario.
Trátalo como entrada no confiable de un formulario, una URL o una petición API.
Datos semilla (ficticios): users(id, email, role) con 5 filas y orders(id, user_id, amount) con 6 filas. Cada lado usa su propia copia.
Qué hace SQL Injection Safety Lab
SQL Injection Safety Lab muestra, lado a lado, qué ocurre cuando un valor controlado por el usuario se pega en el texto SQL frente a cuando se vincula como parámetro. La consulta insegura resalta qué caracteres del valor se interpretaron como SQL (comillas cerradas, condiciones OR añadidas, comentarios, cláusulas extra), mientras que la consulta parametrizada mantiene fijo el texto SQL y muestra el valor aparte como dato. Es una herramienta de aprendizaje defensivo, no un escáner de vulnerabilidades: no hay entrada de URL ni objetivo externo.
Cómo usarlo
- 1.Carga un ejemplo o escribe una sentencia SQL que contenga {{value}} exactamente una vez.
- 2.Escribe el valor controlado por el usuario. Las consultas insegura y parametrizada y la explicación se actualizan al escribir.
- 3.Pulsa Ejecutar comparación para ejecutar ambas consultas sobre datos semilla ficticios en un sandbox SQLite en memoria y comparar las filas devueltas o modificadas.
- 4.Abre Código seguro para copiar una versión parametrizada para PostgreSQL, MySQL, SQLite o SQL Server en SQL, JavaScript/TypeScript, Python, PHP, Java o Go.
- 5.Restablecer base de datos recupera los datos semilla tras cualquier escritura.
Vincular valores y usar listas permitidas para identificadores
Los valores van en parámetros: PostgreSQL usa $1, MySQL y SQLite usan ?, SQL Server usa @p1, y los drivers tienen sus propias convenciones, como %s en psycopg o :name en PDO. El laboratorio sigue cada driver al generar código. Los nombres de tablas, columnas y campos de ORDER BY no se pueden vincular, así que la ruta segura asigna la entrada a un identificador fijo de una lista permitida y rechaza todo lo demás. La pestaña Revisor de código analiza el código pegado en busca de SQL interpolado, formateado o concatenado e informa cada coincidencia como posible riesgo de inyección SQL, porque no rastrea el origen de los valores.
Sandbox, límites y privacidad
Solo se ejecuta SQLite, dentro de un Web Worker con una compilación WebAssembly de sql.js alojada en el propio sitio. Cada lado de la comparación usa su propia copia en memoria de usuarios y pedidos ficticios, así que una escritura insegura nunca afecta al resultado seguro. Se ejecuta una sentencia por lado; las sentencias apiladas se informan en lugar de ejecutarse. Las consultas se detienen a los 3 segundos, los resultados muestran como máximo 100 filas y 16 columnas, las plantillas se limitan a 4.000 caracteres y los valores a 500. Los fragmentos de PostgreSQL, MySQL y SQL Server son solo de referencia. Las plantillas, valores y código permanecen en tu navegador y nunca se envían a un servidor ni a analítica.
