miércoles, 15 de octubre de 2025

Cómo evitar inyección de fórmulas en Google Sheets + Apps Script

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).
Formula

Estrategia práctica

  1. Sanitizar en el backend (Apps Script) — no confiar en el cliente.
  2. Bloquear los caracteres iniciales peligrosos: = + - @ (y tabulación si aplica).
  3. Anteponer una comilla (') para forzar texto en Sheets o reemplazar el primer carácter por un guion/escape.
  4. Testear con casos maliciosos y con datos válidos.
  5. 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, aplicar sanitizeInput() sobre name, 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)

  1. Actualiza el script con la función de sanitizado.
  2. Crea nuevo despliegue / nueva versión en Apps Script (vX).
  3. Actualiza la URL usada en tu app android (MainActivity / API endpoint) a la nueva versión.
  4. Deshabilita la versión anterior (o revoca acceso) para evitar que siga respondiendo.
  5. 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