if ( parts.length > 4 );
En el buscador del Archivo de la Diputación de Granada hay una comprobación publicada que no comprueba nada. Está escrita, sangrada, con su bloque debajo. Le sobra un punto y coma, y en JavaScript un punto y coma es una decisión.
- Dominio
- archivo.dipgra.es
- Guardado
- 31 AGO 2026
- Comprobado en vivo
- 14 SEP 2026
- Citas
- 10 en 4 ficheros guardados
- Lectura
- unos 3 min
La pestaña lo dice antes que nadie: «FLORA - producto de servicios documentales». Es el programa, presentándose, antes que el archivo o la Diputación. Detrás de la pestaña, una página de entrada con usuario y contraseña, un enlace para pasar sin cuenta y otro para «Verificar la configuración del navegador». Antes de pintar nada de eso, carga nueve ficheros de código. El primero se llama messages_fr.js, los mensajes en francés.

- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 4,0 kB
- sha256
- 8d6877e0d006…
| 1 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:// |
| 2 | <html xmlns=" |
| 3 | <head> |
| 4 | <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> |
| 5 | <title>FLORA - producto de servicios documentales</title>1 |
| 6 | <meta http-equiv="pragma" content="no-cache" /> |
| 7 | <base href=" |
| 8 | <link rel="shortcut icon" href="icons/favicon.ico" /> |
| 9 | <link rel="stylesheet" type="text/css" href="css/flora2.css" /> |
| 10 | <script src="script/messages_fr.js" type=" |
| 11 | <script src="script/system.js" type=" |
| 12 | <script src="script/form.js" type=" |
| 13 | <script src="script/input.js" type=" |
| 14 | <script src="script/ctrl.js" type=" |
| 15 | <script src="script/tools.js" type=" |
| 16 | <script src="script/xml.js" type=" |
| 17 | <script src="script/inputwidget.js" type=" |
| 18 | <script type="text/javascript">var sysIsUTF8 = true;</script> |
| 19 | <script src="script/utils_vb.js" type="text/vbscript" language=" |
| 20 | <script> |
| 21 | function setFocus() { |
| 22 | var codeElem = document. |
El último de los nueve es distinto de todos. La página lo pide en VBScript, un lenguaje de Microsoft que solo ejecutaba Internet Explorer. Los navegadores de hoy leen la etiqueta, no reconocen el tipo y la saltan sin decir nada. El fichero se sigue sirviendo, a todo el que entra, para nadie. El segundo se llama system.js y pesa 60.808 bytes.
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 4,0 kB
- sha256
- 8d6877e0d006…
| 8 | <link rel="shortcut icon" href="icons/favicon.ico" /> |
| 9 | <link rel="stylesheet" type="text/css" href="css/flora2.css" /> |
| 10 | <script src="script/messages_fr.js" type=" |
| 11 | <script src="script/system.js" type=" |
| 12 | <script src="script/form.js" type=" |
| 13 | <script src="script/input.js" type=" |
| 14 | <script src="script/ctrl.js" type=" |
| 15 | <script src="script/tools.js" type=" |
| 16 | <script src="script/xml.js" type=" |
| 17 | <script src="script/inputwidget.js" type=" |
| 18 | <script type="text/javascript">var sysIsUTF8 = true;</script> |
| 19 | <script src="script/utils_vb.js" type="text/vbscript" language=" |
| 20 | <script> |
| 21 | function setFocus() { |
| 22 | var codeElem = document. |
| 23 | if ( codeElem != null ) { |
| 24 | codeElem.focus(); |
| 25 | } |
| 26 | } |
| 27 | </script> |
| 28 | |
| 29 | </head> |
system.js se abre con una advertencia en francés: este fichero contiene las funciones no modificables por el administrador del sitio y reservadas al sistema. Esto no lo escribió el archivo, ni la Diputación. Es el motor del producto, el que viene de fábrica. Los comentarios llevan fechas de 2005 a 2011 y hablan de contrarrestar versiones de Internet Explorer que ya no existen.
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 60,8 kB
- sha256
- 93bf46ea4fa1…
| 1 | /** |
| 2 | * Ce fichier contient les fonctions non modifiables par l'administrateur du |
| 3 | * site et réservées au système. Les appels à ces fonctions sont générés par |
| 4 | * les extensions de balises. |
| 5 | */ |
| 6 | |
| 7 | // tdn 29/07/2005 undefined n'est pas défini sur certains postes IE |
| 8 | // sûrement du à la version du moteur de script. J'essaye de contourner ici |
| 9 | // en déclarant un variable nommée ainsi |
| 10 | try |
| 11 | { |
| 12 | var foo; |
| 13 | if (foo == undefined) |
| 14 | foo = true; |
Dentro hay una función pequeña, SizeAndPos, que sirve para abrir ventanas emergentes donde se abrieron la última vez. Recibe una cadena con números separados por comas, posición y tamaño, y si vienen cuatro más los guarda también. Para saber si vienen, comprueba cuántos trozos tiene la cadena: si son más de cuatro, lee los otros cuatro. Está escrito exactamente así. Con una salvedad de un carácter.
La línea de la comprobación termina en punto y coma. En JavaScript, el punto y coma cierra la instrucción: la condición se evalúa, el resultado se tira, y el if se queda sin nada que gobernar. Las llaves que vienen debajo, con sus cuatro líneas dentro, ya no dependen de nada. Son un bloque suelto, y un bloque suelto se ejecuta siempre. El código está sangrado, con el margen metido hacia dentro, como si el bloque fuera del if. No lo es. Lo parece.
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 60,8 kB
- sha256
- 93bf46ea4fa1…
| 1236 | // initData = x,y,w,h |
| 1237 | function SizeAndPos(initData) |
| 1238 | { |
| 1239 | if ( initData != null ) |
| 1240 | { |
| 1241 | var parts = initData.split(','); |
| 1242 | this.x = parseInt(parts[0]); |
| 1243 | this.y = parseInt(parts[1]); |
| 1244 | this.w = parseInt(parts[2]); |
| 1245 | this.h = parseInt(parts[3]); |
| 1246 | if ( parts.length > 4 ); |
| 1247 | { |
| 1248 | this.dx = parseInt(parts[4]); |
| 1249 | this.dy = parseInt(parts[5]); |
| 1250 | this.dw = parseInt(parts[6]); |
| 1251 | this.dh = parseInt(parts[7]); |
| 1252 | } |
| 1253 | } |
| 1254 | else |
| 1255 | { |
| 1256 | this.x = 0; |
| 1257 | this.y = 0; |
¿Y cuándo llega la cadena con cuatro trozos y no con ocho? Cada vez que se abre una ventana emergente sin que haya un contexto guardado. La propia función que abre ventanas pone por defecto «0,0,450,450», cuatro números. La ayuda para enlazar registros desde un formulario abre la suya con «0,0,1050,650», cuatro también. Con cuatro trozos, el quinto no existe, y convertir en número algo que no existe da NaN, el número que no es un número.
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 60,8 kB
- sha256
- 93bf46ea4fa1…
| 1367 | // par défaut, la fenêtre est centrée, avec taille de 450 |
| 1368 | // - options : si non spécifié, on utilise par défaut |
| 1369 | // "toolbar= |
| 1370 | // renvoie l'objet window |
| 1371 | function sysOpenWindow(win_name, url, showStatus, sizeAndPos, options) |
| 1372 | { |
| 1373 | //remove invalids characters from win name |
| 1374 | win_ |
| 1375 | var sp = sysGet |
| 1376 | if ( sp == null ) |
| 1377 | { |
| 1378 | if ( ! sizeAndPos || sizeAndPos == '') |
| 1379 | sizeAndPos = "0,0,450,450"; |
| 1380 | sp = new SizeAndPos(sizeAndPos); |
| 1381 | sp.center(); |
| 1382 | } |
| 1383 | else |
| 1384 | { |
| 1385 | var tmpSp = new SizeAndPos(sizeAndPos); |
| 1386 | tmpSp.x = sp.x; |
| 1387 | tmpSp.y = sp.y; |
| 1388 | |
| 1389 | if(sp.w!=-1 && sp.w > tmpSp.w ){ |
| 1390 | tmpSp.w = sp.w; |
| 1391 | } |
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 75,0 kB
- sha256
- 2492ff6e738b…
| 1112 | } |
| 1113 | |
| 1114 | if ( multimax > 1 ) |
| 1115 | cgi += "&multimax=" + myEscape(multimax); |
| 1116 | |
| 1117 | var tmp = action.split('/'); |
| 1118 | |
| 1119 | var actionId = tmp[tmp.length-1]; |
| 1120 | actionId= |
| 1121 | var winName = "win_ |
| 1122 | // Ouvre la fenêtre |
| 1123 | sysOpenWindow(winName, cgi,false,"0,0,1050,650"); |
| 1124 | } |
| 1125 | |
| 1126 | //Ouvre une nouvelle fenêtre pour exécuter l'action en paramètre |
| 1127 | //formNane est le formulaire où se trouve le champ dest |
| 1128 | //requête à executer |
| 1129 | function open |
| 1130 | { |
| 1131 | // Ajoute automatiquement le paramètre source si nécessaire |
| 1132 | var frame = this.name; |
| 1133 | var cgi = action; |
| 1134 | //Verifie si il n'existe pas deja des parametres. |
No lo hemos deducido: lo hemos ejecutado. Copiamos la función tal como está en el fichero, sin tocar una coma, y la llamamos con «0,0,450,450». Devuelve x, y, ancho y alto correctos, y detrás cuatro campos que valen NaN. Al guardar ese contexto para la próxima vez, la cadena que se escribe es “0,0,450,450,NaN,NaN,NaN,NaN”. La comprobación estaba escrita para que eso no pasara.
Ahora la parte honesta. ¿Qué rompe? En este fichero, casi nada visible: esos cuatro campos solo los vuelve a leer la función que los guarda, y de ahí no salen. El vigilante duerme, pero la puerta que vigilaba da a un cuarto vacío. Lo que enseñamos es una comprobación que lleva escrita, sangrada y publicada desde que existe el fichero, y que no ha comprobado nada ni una sola vez.
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 60,8 kB
- sha256
- 93bf46ea4fa1…
| 1267 | } |
| 1268 | // Ajuste la position pour que la fenêtre soit centrée |
| 1269 | SizeAndPos.prototype.center = function() |
| 1270 | { |
| 1271 | this.x = (screen.width - this.w) / 2; |
| 1272 | this.y = (screen.height - this.h) / 2; |
| 1273 | |
| 1274 | } |
| 1275 | // Renvoie un chaîne représentant l'objet |
| 1276 | SizeAndPos. |
| 1277 | { |
| 1278 | var spData = this.x + "," + this.y + "," +this.w + "," + this.h |
| 1279 | + "," + this.dx + "," + this.dy + "," +this.dw + "," + this.dh; |
| 1280 | return spData; |
| 1281 | } |
| 1282 | |
| 1283 | |
| 1284 | |
| 1285 | // Renvoie un objet SizeAndPos |
| 1286 | function sysGet |
| 1287 | { |
| 1288 | if ( windowObj == null ) |
| 1289 | windowObj = window; |
| 1290 | var sp = new SizeAndPos(); |
El servidor dice que system.js se modificó por última vez el 30 de julio de 2024. Lo guardamos el 31 de agosto de 2026 y lo volvimos a pedir el 14 de septiembre: los mismos 60.808 bytes. La portada también salió idéntica, llave incluida. El enlace para verificar el navegador lleva una llave abierta delante y otra cerrada detrás. Casi nadie lo ha visto, y no por la llave: la hoja de estilos pinta ese enlace de blanco sobre fondo blanco, y solo toma color al pasarle el ratón por encima. En la captura de abajo, el recuadro marca dónde está. Dentro no se ve nada. Está.

- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 4,0 kB
- sha256
- 8d6877e0d006…
| 67 | <input type="hidden" name="failure" value="jsp/error.jsp" /> |
| 68 | <input type="hidden" name="profile" value="anonymous" /> |
| 69 | |
| 70 | <input type="hidden" name="connectionSiteId" value="1" /> |
| 71 | <br /> |
| 72 | <h5 id="IndexAnonymous">Todavía no tiene cuenta de usuario: |
| 73 | <a href=" |
| 74 | </form> |
| 75 | </div> |
| 76 | |
| 77 | <h5 id="IndexVerification"> |
| 78 | <a href=" |
| 79 | Verificar la configuración del navegador}</a></h5> |
| 80 | |
| 81 | </body> |
| 82 | </html> |
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 76,4 kB
- sha256
- 3bd5a5e400b2…
| 418 | #IndexVerification { |
| 419 | position: relative; |
| 420 | margin-top: 105px; |
| 421 | text-align: center; |
| 422 | } |
| 423 | |
| 424 | #IndexAnonymous { |
| 425 | color: #707070; |
| 426 | } |
| 427 | |
| 428 | #IndexVerification a { |
| 429 | color: white; |
| 430 | } |
| 431 | |
| 432 | #IndexVerification a:hover { |
| 433 | color: #6B6B6B; |
| 434 | } |
| 435 | |
| 436 | /* |
| 437 | * frame workspace |
| 438 | */ |
| 439 | |
| 440 | /* Main Menu */ |
| 441 | .MainMenu { |
En JavaScript un punto y coma es una decisión. Esta se tomó sola.
- system.js, que la portada de archivo.dipgra.es carga en segundo lugar, contiene en la función SizeAndPos una condición cerrada con punto y coma antes de su bloque, de modo que el bloque se ejecuta siempre.
- Las ventanas se abren por defecto con cadenas de cuatro números.
- La función, ejecutada tal cual con esa cadena, deja cuatro campos en NaN.
- Esos campos solo los vuelve a leer la función que los serializa.
- La página carga un script en VBScript y un fichero de mensajes en francés.
- Su título es el nombre del producto.
- El enlace de verificación del navegador se sirve con una llave a cada lado y en color blanco.
- Que ningún usuario del archivo note nada: hemos medido que los campos afectados no se usan para nada visible.
- Cuánto lleva el punto y coma en el fichero: el servidor da la última modificación (julio de 2024) y las fechas de los comentarios van de 2005 a 2011, pero ninguna dice cuándo se escribió esa línea.
- Qué versión del producto es.
- Quién debía haberlo visto: la cabecera dice que el fichero es del sistema y no lo toca el administrador del sitio.
De dónde sale cada cita
Cada trozo de código de esta ficha está en un fichero guardado tal como lo entregó el servidor, con su huella (sha256) y su hora. Las citas entre «» se comprueban por programa contra ese fichero antes de publicar.
- https://archivo.dipgra.es/Archivo-Dipgra/31 de agosto de 2026, 15:44archivosha256 8d6877e0d006ddfa24fd55743e120bd84c723ed54e616aa3a4e89bfeeddc5165
- https://archivo.dipgra.es/Archivo-Dipgra/14 de septiembre de 2026, 22:26en vivo · byte a byte igualsha256 8d6877e0d006ddfa24fd55743e120bd84c723ed54e616aa3a4e89bfeeddc5165
- https://archivo.dipgra.es/Archivo-Dipgra/script/system.js31 de agosto de 2026, 15:44archivosha256 93bf46ea4fa173c72b815864cfb620b5e24a32fefbe3d125caeb422f3e7d391e
- https://archivo.dipgra.es/Archivo-Dipgra/script/system.js14 de septiembre de 2026, 22:26en vivo · byte a byte igualsha256 93bf46ea4fa173c72b815864cfb620b5e24a32fefbe3d125caeb422f3e7d391e
- https://archivo.dipgra.es/Archivo-Dipgra/script/input.js31 de agosto de 2026, 15:44archivosha256 2492ff6e738b6844184a2dca1fcb0a902e793576685e6b8db7e67324e6704997
- https://archivo.dipgra.es/Archivo-Dipgra/css/flora2.css31 de agosto de 2026, 15:44archivosha256 3bd5a5e400b276e22bc632ba38ae5ff7d16f094f1dbbfd2e809ddfe7e3cbaf95