Ir al contenido

Tunnel Connector

El Tunnel Connector permite que Floogos ejecute queries MySQL contra una base de datos en tu hosting compartido — ese donde el puerto de MySQL no es accesible desde fuera y no hay VPN ni API. Subís un único archivo PHP a tu hosting y Floogos habla con él por HTTPS, de forma segura, sin exponer nunca tu base de datos.

Floogos ──HTTPS POST──► tunnel.php (tu hosting) ──PDO──► MySQL (localhost)
X-Tunnel-Secret

Floogos nunca se conecta directo a MySQL. Envía una query (como JSON) a tunnel.php por el puerto 443 — que ya está abierto en cualquier hosting web — y el túnel la ejecuta localmente con prepared statements y devuelve las filas.

  • Cualquier hosting con PHP 7.4+ y MySQL/MariaDB (hosting compartido, cPanel, VPS…).
  • Acceso para subir un archivo (FTP/SFTP o el file manager).
  • El usuario y la contraseña de la base de datos (los mismos que ya usa tu sitio).

Completá los datos de tu base de datos abajo. El asistente genera un secret aleatorio fuerte y arma tu tunnel.config.php. Todo ocurre en tu navegador — no se envía nada a ningún lado.

Asistente de configuración

Completá los datos, generá el secret y descargá tu tunnel.config.php. Todo ocurre en tu navegador — no se envía nada.

Base de datos MySQL
Seguridad IP del servidor de Floogos, separadas por coma. Vacío = cualquier IP (no recomendado).
tunnel.config.php generado Descargar tunnel.php
 

⚠️ Este archivo contiene credenciales: subilo por FTP/SFTP, nunca a un repositorio público, e idealmente fuera del webroot.

  1. Desde el asistente de arriba, descargá ambos archivos: tunnel.php (el conector, igual para todos) y tu tunnel.config.php generado.

  2. Subí ambos archivos a tu hosting por FTP/SFTP o el file manager, por ejemplo bajo una carpeta como public_html/floogos/:

    public_html/
    └── floogos/
    ├── tunnel.php
    └── tunnel.config.php
  3. (Recomendado) Para mayor seguridad, mové tunnel.config.php fuera del webroot y apuntá a él desde tunnel.php:

    require_once '/home/tuusuario/config/tunnel.config.php';

Desde cualquier terminal, enviá una query de prueba (reemplazá la URL y el secret por los tuyos):

Ventana de terminal
curl -s -X POST https://tu-dominio.com/floogos/tunnel.php \
-H "Content-Type: application/json" \
-H "X-Tunnel-Secret: tu-secret" \
-d '{"sql":"SELECT 1 AS ping","params":{}}'

Respuesta esperada:

{ "ok": true, "rows": [{ "ping": 1 }], "insertId": null, "rowCount": 1 }

Después, en Floogos, creá una credencial Tunnel con la URL de tu tunnel.php y el mismo secret, y ya podés consultar la base de datos de tu hosting desde cualquier workflow.

El túnel aplica 8 capas de seguridad antes de que una query llegue a tu base de datos:

#CapaQué hace
1MétodoSolo se acepta POST.
2AutenticaciónX-Tunnel-Secret comparado con hash_equals() (a prueba de timing), retraso aleatorio en fallo.
3Whitelist de IPTUNNEL_ALLOWED_IPS opcional para restringir qué servidores pueden llamar.
4Rate limitingToken bucket por minuto (default 300).
5Tamaño del bodyMáximo (default 64 KB).
6Validación SQLBloquea DDL/DCL, multi-statement y keywords peligrosas (ver abajo).
7PDO estrictoMULTI_STATEMENTS = false, sql_mode estricto.
8Prepared statementsSiempre parametrizado — inmune a SQL injection.

Todo intento bloqueado queda registrado en el audit log.

SentenciaPermitida
SELECT, INSERT, UPDATE✅ Sí (INSERT/UPDATE no en tablas protegidas)
DELETE⚠️ Solo en tablas de lista blanca
DROP, ALTER, TRUNCATE, CREATE, GRANT, CALL, LOCK❌ Siempre bloqueado

Keywords peligrosas como INTO OUTFILE, LOAD_FILE(, SLEEP(, BENCHMARK(, mysql.user y las queries multi-statement se rechazan. Podés marcar tablas como solo lectura (ej. users, permisos, tokens) para que el túnel nunca pueda escribir en ellas.

  • 403 Forbidden — el secret no coincide, o la IP que llama no está en TUNNEL_ALLOWED_IPS.
  • Timeout — verificá que la URL de tu tunnel.php sea accesible por HTTPS desde internet.
  • “Multi-statement no permitido” — quitá el ; del medio de la query.
  • “DELETE no permitido en tabla X” — agregá la tabla a la lista blanca de DELETE en tunnel.php si el DELETE es legítimo.