ZONA PREMIUM+ y SATPLAY VIP MULTISTREAM - COPIAS NUEVAS EN cojedor.top + REVISION DE SEGURIDAD Fecha: 2026-10-04 (hora Europa/Roma). Las claves estan SOLO en Zonapremi-Multistream-claves.txt. IMPORTANTE: estas son COPIAS NUEVAS e independientes. NO se ha tocado nada de zonapremi.satplaytv.com ni multistream.satplaytv.com (ni DNS, ni hosting). Las apps que apuntan a esos dominios siguen funcionando contra tu hosting real. ===================================================================== 1. RESUMEN DE LO MONTADO ===================================================================== ZONA PREMIUM+ SATPLAY VIP MultiStream Web publica https://zonapremi.cojedor.top/ https://multistream.cojedor.top/ Acceso LAN http://192.168.178.47:8148/ http://192.168.178.47:8149/ Panel master /index.php (usuario/clave en claves) /index.php (master) + /acceso-admin-v2.php /acceso-super-reseller.php /acceso-reseller.php Carpeta /opt/zonapremi /opt/multistream Contenedor zonapremi-web (php:8.2-apache + zip) multistream-web (php:8.2-apache) Puerto 8148 (solo localhost + LAN, ufw LAN) 8149 (idem) Tunel Cloudflare cloudflared-zonapremi cloudflared-multistream (servicios systemd; no se tocaron los tuneles existentes) Codigo /opt//src (montado SOLO LECTURA) Datos /opt//data (BD SQLite, trials, throttle, backups del panel, secreto) FUERA del web root Copias /opt//backups : ZIPs originales + post-montaje-*.tgz Version Zona Premium usada: "ZONA PREMIUM FULL.zip" (identico, archivo por archivo, a ..._FIX_GENERADOR_CODIGO.zip). El zip "..._PATCHED.zip" es MAS ANTIGUO (7 ficheros distintos: acesso_livre.php sin modo credenciales, generate_trial_code.php con alias antiguos, cliente.php, crear_demo.php, planes_reseller.php, includes/services.php y la BD). FULL/FIX incluye el modo credenciales y el arreglo del generador de Cine Premium V2. Multistream: PANEL_SATPLAY_VIP_MULTISTREAM_PROFESIONAL.zip (unica version). Operacion: cd /opt/ && docker compose logs -f | docker compose restart | (tras cambiar codigo en src no hace falta reconstruir; PHP lee los ficheros). Reconstruir imagen: docker compose up -d --build. Copia de datos: tar czf /opt//backups/x.tgz -C /opt/ data. ===================================================================== 2. MEDIDAS APLICADAS A LAS DOS COPIAS (mismas que Spotify/YouTube/tiendas) ===================================================================== - Docker PHP 8.2 + Apache, codigo en solo lectura, php.ini endurecido (display_errors Off, disable_functions exec/system/..., open_basedir, expose_php Off), Apache: sin listado de directorios, bloqueo de .db .sqlite .log .ini .json .txt .zip y de /includes, cabeceras nosniff / X-Frame-Options / Referrer-Policy, IP real via Cloudflare. - BD fuera del web root. En Zona Premium via enlaces simbolicos api/.db.db -> /var/yt-data/.db.db ; en Multistream via includes/paths.php (YT_DATA_DIR). - Sesion obligatoria en todas las paginas del panel (se comprobo cada una: sin sesion -> redirige al login). Publicas por diseno: login, acesso_livre, cliente, planes_reseller, account_expired, api/check_code*, api/dns*, api/generate_trial_code, api/player_api*, get/stream/playlist. - Claves de master y de paneles (admin v2 / super reseller / reseller) guardadas con hash bcrypt; las claves ACTUALES siguen valiendo y se convierten solas en el primer login. Las cuentas de clientes finales (rol "client") y los codigos NO se hashean: la app los envia tal cual y el panel los muestra al revendedor. - Antifuerza bruta: 8 fallos por usuario+IP o 40 por IP en 15 min bloquea el login; igual para login de clientes en player_api y adivinar codigos en check_code. - Cookies de sesion Secure/HttpOnly/SameSite=Lax. Defensa CSRF por origen en acciones peligrosas (POST y GET borrar/bloquear/...). - Datos de terceros eliminados: trial_cadastros.json (telefonos/IP de terceros) vaciado; nombres/telefonos de clientes en codes (Zona Premium) borrados; codes de prueba de Zona Premium conservados sin nombres ni telefonos; fila dns "Rest -> sfora.xyz" (tercero) borrada en ambas. - Telefonos de terceros -> 393345297161: public_whatsapp_* (settings), sx_default_whatsapp() (services.php) y contacto de config.ini (ahora https://wa.me/393345297161). - Marca: logo SatPlayTV (login y menu) y pie "Creado por SatPlayTV - (c) 2026 SatPlayTV. Todos los derechos reservados." en login y paginas internas. Se mantiene el nombre de producto ZONA PREMIUM+ / SATPLAY VIP MultiStream. Quitado el pie "BY IANKEY .." y el enlace de soporte de team-vip1.com (ahora wa.me/393345297161). ===================================================================== 3. ZONA PREMIUM+ - HALLAZGOS DE SEGURIDAD Y CORRECCIONES (archivo: original -> nuevo) ===================================================================== [CRITICO] fixcodes.php : publico, sin sesion, modificaba la BD (ALTER TABLE) -> ELIMINADO. [ALTO] index.php : clave de master y de paneles comparada y guardada en texto plano -> hash + migracion; ademas cualquier cuenta con rol "client" podia entrar al PANEL con su usuario/clave de la app -> ahora se rechaza. [ALTO] api/.db.db, api/trial_cadastros.json, api/api_debug.log, backups/ en el web root (solo protegidos por .htaccess) -> fuera (data/), Apache los deniega y los ficheros ya no estan en src. [ALTO] includes/backup_tools.php : copias completas de la BD se guardaban en /backups dentro del web root -> ahora data/backups. Restaurar backup sigue siendo solo MASTER. [ALTO] api/m3u_helpers.php : (1) lectura de ficheros locales como "fuente M3U" (LFI) si la ruta era legible -> eliminado, solo http/https; (2) SSRF: descargaba cualquier URL (incl. localhost / red interna / metadatos) -> ahora solo IPs publicas. [MEDIO] main.php : XSS almacenado (codigo sin escapar en tabla y en el campo de edicion) -> htmlspecialchars. [MEDIO] adduser.php / edit_user.php / user.php : alta/edicion de paneles con hash; el formulario ya no muestra la clave guardada ("dejar vacio para mantener"). Se hashea la clave real escrita (antes pasaba por sanitize() y claves con & < > ' no coincidian al entrar). [MEDIO] api/player_api.php, m3u_helpers.php (get/stream), quick_resume.php : comparacion de claves en tiempo constante; antifuerza bruta en player_api* y get/stream/playlist. [MEDIO] api/check_code*.php : adivinar codigos sin limite -> 40 fallos / 15 min por IP. [MEDIO] Acciones GET (bloquear, borrar, reset dispositivos, borrar historial) sin proteccion -> rechazadas si vienen de otro sitio (guard global). [BAJO] api/a.php (neutralizado), default.php (bienvenida hosting), sistema_sessao.php (sin uso), LICENSE, 4 LEEME/CAMBIOS .txt con dominios, .htaccess con manejador cPanel -> eliminados de src (los .htaccess se sustituyeron por reglas en Apache: /playlist, /get, /live siguen funcionando). [INFO] La clave master incluida en la BD es muy floja (7 caracteres): cambiala (Mi cuenta). Revisado sin hallazgo: inyeccion SQL (todo con parametros), ejecucion de comandos (ninguna), subidas (solo restaurar backup, master). Dominio de la copia: api/dns.php, api/generate_trial_code.php y la pantalla de alta de clientes muestran ahora https://zonapremi.cojedor.top/api/ (antes zonapremi.satplaytv.com/api/). ===================================================================== 4. MULTISTREAM - REVISION DE CODIGO (lo que ya funcionaba bien en tu hosting, pero tiene fallos) ===================================================================== [CRITICO] index.php : CREDENCIAL MASTER FIJA escrita en el codigo (usuario + clave), que al usarse REESCRIBIA la fila master y borraba cualquier otro master (DELETE FROM user WHERE id<>1). La misma clave estaba en INFORME_CAMBIOS_SEGURIDAD.txt dentro del web root. -> bloque eliminado; docs fuera de src. [ALTO] BD : claves de master/paneles en texto plano -> hash bcrypt (migracion automatica al primer login con la clave actual). [ALTO] myteam.php / functions.php : "Mi equipo" ponia la clave guardada de TODOS los hijos en el enlace de WhatsApp -> ya no se envia; solo se muestra al crear/cambiar. [ALTO] includes/auth.php : si no se podia escribir api/.auth_secret, la firma de la cookie multistream_panel_auth (y de los tokens CSRF) usaba un secreto FIJO derivado de la ruta del script -> cookie de master falsificable. -> secreto aleatorio por sesion. Ademas la cookie (24 h) quedaba valida aunque cambiaras la clave -> ahora lleva huella de la clave. [ALTO] api/.db.db, .auth_secret, trial_cadastros.json, private-backups/ en el web root (protegidos solo por .htaccess; en Nginx/otros hostings serian descargables) -> rutas centralizadas (includes/paths.php), opcion de sacarlas fuera, .htaccess reforzados. [MEDIO] Sin limite de intentos en login, player_api (clientes) y check_code (codigos) -> antifuerza bruta (8/usuario, 40/IP, 15 min). [MEDIO] check_code.php / functions.php real_ip(): IP leida de X-Forwarded-For/Client-IP (falsificable; se usa para sesiones/limites) -> yt_client_ip() solo confia en cabeceras de proxy/Cloudflare. [MEDIO] Acciones GET (borrar historial, borrar codigo, bloquear/desbloquear equipo, logout) sin token CSRF -> guard por origen. (Los POST ya llevaban token firmado.) [MEDIO] main.php : XSS almacenado (codigo sin escapar) -> htmlspecialchars. [BAJO] Cookie de sesion sin Secure detras de Cloudflare ($_SERVER['HTTPS'] vacio) -> deteccion por X-Forwarded-Proto; HttpOnly/SameSite. [BAJO] fixcodes.php (publico, modifica BD), default.php, sistema_sessao.php, api/a.php (generaba cientos de revendedores; ya neutralizado) -> eliminados. [BAJO] Fallo MIO corregido durante las pruebas: al entrar al panel con una cuenta "client" su clave se convertia a hash y rompia su login en la app. Ahora solo se migra tras validar el rol. Revisado sin hallazgo: inyeccion SQL (parametros; unico UPDATE dinamico usa nombres internos fijos), XSS en el resto de salidas (htmlspecialchars), subidas (solo restaurar backup: master + token + sha256), ejecucion de comandos, SSRF (calllink no se usa con datos del usuario). Notas: la sesion del panel caduca a los 15 min pero la cookie "recordada" (24 h) la reabre -> comportamiento original; se mantiene (ahora ligada a la clave). Las URLs de las apps de Multistream (segun los LEEME originales) apuntan a multistream.team-vip1.com/api/check_code.php: eso es de tu hosting actual y no se ha tocado. PAQUETE DE PARCHES PARA TU HOSTING REAL: C:\Users\cojedor\Downloads\Multistream-parches-hosting.zip (LEEME-INSTRUCCIONES.txt con pasos, comprobaciones y vuelta atras; archivos/ corregidos; htaccess/; borrar.txt; cambios.diff). NO aplicado en ningun sitio. Probado: se superpuso sobre el ZIP original en un contenedor limpio sin variables de entorno y el login con la clave actual funciona. Zona Premium: no se ha preparado paquete para el hosting real (depende de enlaces simbolicos y de un guard global propios de Docker); si lo quieres, se hace aparte. ===================================================================== 5. REFERENCIAS DE TERCEROS / PAGOS / LICENCIAS - SOLO REPORTADO, SIN TOCAR ===================================================================== - Codigos de Downloader (aftv.news/...) para descargar las APK: 3235569, 4232012, 5322957, 7561420, 3395967, 2404909, 1205887 (config_teste.php, services.php, acesso_livre.php, crear_demo.php, generate_trial_code.php, planes_reseller.php, cliente.php y tabla settings app_download_url_*). Son de tus apps; revisa que sigan siendo tuyos. - Multistream: includes/functions.php apunta las descargas por defecto a apks.team-vip1.com (YouTube Tv / YouTube Mobil / DramaBox ... Multistream.apk) y settings app_downloader_code_youtube_mobile=2905766. - Cadenas de deteccion de dominios antiguos en el codigo (zona-premium.team-vip1.com, rtxrebrands.com, zonapremi.satplaytv.com): solo comparan, no envian datos. - Planes / precios / "Comprar WhatsApp" (planes_reseller.php) y textos de licencia: sin cambios (el numero de contacto sale de settings y ahora es el tuyo). - Marcas de terceros en imagenes de Zona Premium (img/: ankey-*, cinepremium-*, multimarca-*, spotify, youtube, streamix...) y nombres de servicios (Spotify, YouTube, Cineplay...): sin cambios. - Placeholders de ejemplo en formularios (593999999999, 11999999999): sin cambios (son ejemplos). ===================================================================== 6. SE NECESITAN LAS APPS REPUNTADAS? ===================================================================== NO, mientras sigas usando los dominios actuales (zonapremi.satplaytv.com / multistream.satplaytv.com): siguen contra tu hosting real y sus datos. Solo si quisieras usar las copias de cojedor.top habria que cambiar en las APK (o en el campo DNS/portal) la URL base a https://zonapremi.cojedor.top/api/ o https://multistream.cojedor.top/api/. Las copias empiezan con BD de tu ZIP (sin clientes), asi que no contienen tus clientes reales. ===================================================================== 7. PRUEBAS REALIZADAS (curl, copia local y por https) ===================================================================== Login con la clave actual (http y https) y migracion a hash; relogin tras el hash; clave mala; bloqueo por fuerza bruta; paginas protegidas sin sesion (302) y con sesion (200); rol client rechazado en el panel; alta de reseller (hash) y login; CSRF cross-site 403 / same-origin ok; cookie forjada rechazada; restauracion de sesion por cookie firmada; APIs publicas (check_code, dns, player_api, generate_trial_code con escritura en data/); URLs de BD/log/backups/includes/config = 403/404; limite de intentos de check_code; lint php -l de todos los ficheros. Datos de prueba borrados (BD limpia). ===================================================================== 8. CAMBIO POSTERIOR (04/10/2026): "Codex TV" -> "App varias" en MULTISTREAM ===================================================================== Etiqueta visible cambiada en panel (selector de aplicacion), acceso publico (acesso_livre.php) y respuesta de la API de demos: includes/functions.php (2 catalogos), api/generate_trial_code.php y acesso_livre.php. El valor interno sigue siendo 'variado' (lo usan check_code y los codigos existentes), asi que nada se rompe. El texto antiguo "codex tv"/"codex_tv" sigue aceptandose como alias de entrada y se añaden "app varias"/"app_varias". La BD no contenia el texto "codex" (0 coincidencias). Backup previo: /opt/multistream/backups/pre-appvarias-*.tgz. Pruebas: demo con service=variado y check_code con el valor interno y los tres alias = OK; acesso_livre muestra "App varias". Incluido en Downloads\Multistream-parches-hosting.zip (punto 12 del LEEME; ficheros acesso_livre.php, api/generate_trial_code.php, includes/functions.php). ===================================================================== 9. NUEVO (04/10/2026): INDICADOR "EN LINEA / VIENDO AHORA" + "ULTIMA ACTIVIDAD" EN LOS PANELES ADMIN ===================================================================== PROBLEMA: los paneles no mostraban si un cliente estaba mirando ahora mismo. - MultiStream: la presencia solo se guardaba en codes.used_by (sesiones de dispositivo, 30 s) y existia el JSON online_clients.php, pero NINGUNA pantalla lo usaba (ni dashboard.php ni clients.php), asi que el admin nunca veia nada. - Zona Premium+: ya tenia tabla client_activity y pagina "Clientes Online", pero (a) solo se registraba en player_api/heartbeat/check_code, no al bajar la playlist M3U (api/get.php) ni al reproducir un canal (api/stream.php); (b) el contador usaba conexiones de 3 min y la pagina marcaba "Online" hasta 30 min; (c) la lista de cuentas usuario+clave no tenia columna de actividad clara; (d) client_activity se purga a los 7 dias, asi que se perdia la "ultima actividad". QUE CUENTA COMO "EN LINEA" (punto verde): senal del cliente en los ultimos 5 minutos. - MultiStream: dispositivo con check_code en los ultimos 30 s, o ultimo check_code valido (codes.last_seen) hace < 5 min sin action=logout posterior (codes.last_logout). Constante YT_ONLINE_WINDOW_SECONDS en includes/functions.php. - Zona Premium+: cualquier senal (player_api, heartbeat, check_code, get.php, stream.php) hace < 5 min. Constante SX_SEEN_ONLINE_SECONDS en includes/activity.php. En "Clientes Online" lo que tiene senal entre 5 y 30 min sale en gris como "Reciente". Importante: el panel solo puede saber lo que la app le dice. La app debe llamar a check_code / player_api / heartbeat (o bajar la playlist / abrir un canal) mientras se usa. En MultiStream lo ideal es el latido (check_code cada pocos segundos con device_id) y action=logout al salir; si la app solo valida al abrir, se vera "en linea" 5 min tras abrir. COMO SE VE - Punto verde pulsante + "En línea" y debajo "hace X s/min"; punto gris + "Offline" y "hace X min/h/d" o "Nunca". - MultiStream: Dashboard -> tarjeta "Clientes en línea ahora: N" con tabla (cliente, codigo, servicio, dispositivos, ultima actividad; se refresca cada 15 s); Clientes -> nueva columna "Actividad". - Zona Premium+: Dashboard -> "Clientes en línea ahora" (clientes distintos, 5 min); Cuentas Cine Premium -> nueva columna "Actividad"; "Clientes Online" -> En línea / Reciente. DATOS NUEVOS (migracion segura, aditiva, no toca ni borra datos; se crea sola en la primera peticion) - MultiStream: codes.last_seen y codes.last_logout (INTEGER). SQL manual opcional: sql/migracion-last-seen.sql dentro de Multistream-parches-hosting.zip. - Zona Premium+: tabla client_last_seen (service, client_key, client_name, owner, last_seen UTC, last_ip, source). SQL opcional: sql/migracion-client_last_seen.sql en Zonapremi-enlinea-parche.zip. No hace falta tocar las apps. No afecta al limite de conexiones/dispositivos. SEGURIDAD: consultas preparadas; online_status.php (MultiStream) devuelve 401 sin sesion y 403 a roles no gestores; cada usuario solo ve sus clientes (mismo alcance que clients.php); un revendedor ajeno ve 0. Las claves malas no registran actividad. Nada de esto es visible para clientes finales. FICHEROS CAMBIADOS MultiStream (/opt/multistream/src y Multistream-parches-hosting.zip -> archivos/): includes/functions.php, includes/header.php (estilo del punto), api/check_code.php, clients.php, dashboard.php y online_status.php (NUEVO). Punto 13 del LEEME-INSTRUCCIONES del zip. Zona Premium+ (/opt/zonapremi/src; paquete nuevo Zonapremi-enlinea-parche.zip, solo esta mejora sobre el ORIGINAL): includes/activity.php, includes/credential_clients.php, dashboard.php, online_clients.php, api/get.php, api/stream.php. (No existia zip de parches de Zona Premium; este incluye LEEME, cambios.diff y SQL.) BACKUPS previos: /opt/zonapremi/backups/pre-enlinea-*.tgz y /opt/multistream/backups/pre-enlinea-*.tgz (src + data). PRUEBAS (curl, copia cojedor): cliente de prueba -> antes "Offline/Nunca"; tras check_code (con y sin device_id) / get.php / player_api / heartbeat -> "En línea / hace 0 s", contador del dashboard 0->1, JSON online_status 401 sin sesion; action=logout -> vuelve a Offline; clave mala en get.php (403) no registra; reseller ajeno ve 0 clientes. Datos de prueba borrados. NO se ha aplicado nada en el hosting real (zonapremi.satplaytv.com / multistream.satplaytv.com): para ello usa los zips (PASO 1 del LEEME).