La inyección de fórmulas ocurre cuando un campo (name, email, etc.)
empieza con =
+
-
@
y Sheets lo interpreta como fórmula; solución: sanitizar los inputs
antes de guardar (ej. anteponer '
o eliminar el carácter
peligroso).
Qué pasa (rápido)
- Usuario envía en un campo:
=TEXTJOIN(\", \"; FALSE; B1:B5)
. - Google Sheets evalúa esa cadena como fórmula y puede revelar datos o ejecutar funciones.
- Es parecido a XSS/SQLi, pero es fórmula en hoja de cálculo (Sheet Formula Injection).

Estrategia práctica
- Sanitizar en el backend (Apps Script) — no confiar en el cliente.
- Bloquear los caracteres iniciales peligrosos:
= + - @
(y tabulación si aplica). - Anteponer una comilla (
'
) para forzar texto en Sheets o reemplazar el primer carácter por un guion/escape. - Testear con casos maliciosos y con datos válidos.
- Desplegar nueva versión y deshabilitar la URL/vieja versión vulnerable.
Código (Apps Script) — ejemplo breve y probado
// Sanitiza un input para evitar que Sheets lo evalúe como fórmula.
// Si el valor empieza con = + - @ se antepone una comilla para forzarlo como texto.
function sanitizeInput(value) {
if (typeof value !== 'string') return value;
// Trim y protección rápida
var v = value.trim();
if (v === '') return v;
// Caracteres que convierten la celda en fórmula
if (/^[=+\-@]/.test(v)) {
return "'" + v; // la comilla inicial en Sheets fuerza texto
}return v;
}
/**
* test
*/
function testsanitizeInput() {
console.log('str', sanitizeInput("=TEXTJOIN(\", \"; FALSE; B1:B5)"));
console.log('str', sanitizeInput("test@micorreo-us-max.com"));
}
Resultado esperado: las entradas que empiezan con =
+
-
@
saldrán con una comilla
inicial '
y no serán evaluadas.
Integración en el flujo de registro (puntos clave)
- Al recibir
POST
de registro, aplicarsanitizeInput()
sobrename
,email
y cualquier campo libre. - Guardar resultado en la hoja. Sheets mostrará
'...
como texto (la comilla no se ve en la celda, solo en la edición). - Mantén logs de intento de inyección para monitoreo (no guardar el input sin sanitizar).
Despliegue seguro (pasos rápidos)
- Actualiza el script con la función de sanitizado.
- Crea nuevo despliegue / nueva versión en Apps Script (vX).
- Actualiza la URL usada en tu app android (MainActivity / API endpoint) a la nueva versión.
- Deshabilita la versión anterior (o revoca acceso) para evitar que siga respondiendo.
- Recompila / publica tu app con la nueva URL y prueba registro real.
Mira cómo funciona
En este video explico y muestro todo en acción:
No hay comentarios:
Publicar un comentario