Skip to content

fix(core): corrige comprobación de carpeta segura en Windows#2008

Open
abdedarghal111 wants to merge 1 commit into
NeoRazorX:masterfrom
abdedarghal111:fix/unsafe-folder-windows-path-separator
Open

fix(core): corrige comprobación de carpeta segura en Windows#2008
abdedarghal111 wants to merge 1 commit into
NeoRazorX:masterfrom
abdedarghal111:fix/unsafe-folder-windows-path-separator

Conversation

@abdedarghal111

Copy link
Copy Markdown
Contributor

Problema

Al ejecutar FacturaScripts con el servidor embebido de PHP en Windows nativo (php -S 127.0.0.1:8080 -t . index.php), todos los recursos estáticos (CSS, JS, imágenes de Core, node_modules, vendor...) devolvían el error UnsafeFolder, impidiendo el acceso a cualquier página excepto la de despliegue.

Causa

En Core/Controller/Files.php, la ruta del archivo solicitado se construía concatenando Tools::folder() (que usa DIRECTORY_SEPARATOR) con la URL de la petición (que siempre usa /). La comprobación isFolderSafe() se ejecutaba sobre esa ruta antes de normalizarla con realpath(), comparando cadenas con separadores mezclados.

En Linux/macOS/WSL, DIRECTORY_SEPARATOR es /, por lo que nunca había mezcla y el bug pasaba desapercibido. En Windows, DIRECTORY_SEPARATOR es \, y la comparación de isFolderSafe() nunca encontraba coincidencia, rechazando cualquier archivo como carpeta insegura.

Solución

Se mueve la comprobación isFolderSafe() a después de resolver realpath(), igual que ya hacía Myfiles.php para el mismo tipo de comparación. Así la ruta queda siempre normalizada con el separador correcto del sistema operativo antes de compararla.

Pruebas

  • Servidor embebido de PHP en Windows nativo: los recursos estáticos (node_modules, Core/Assets, etc.) se sirven correctamente.
  • Sin cambios de comportamiento en Linux/WSL (la ruta ya coincidía en esos sistemas).

¿Cómo has probado los cambios?

Toda modificación debe haber sido mínimamente probada. Marca o describe las pruebas que has realizado:

  • He revisado mi código antes de enviarlo.
  • He probado que funciona correctamente en mi PC.
  • He probado que funciona correctamente con una base de datos vacía.
  • He ejecutado los tests unitarios.

La ruta del archivo se comparaba antes de normalizar con realpath(),
mezclando separadores '/' de la URL con '\' de DIRECTORY_SEPARATOR
en Windows. Esto hacía que isFolderSafe() nunca encontrara coincidencia
y se rechazara como UnsafeFolder cualquier recurso estático (CSS, JS,
imágenes de Core, node_modules, vendor...).

Se mueve la comprobación de isFolderSafe() a después de resolver
realpath(), igual que ya hace Myfiles.php.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant