Estoy jugando en www.example.com/index.php
pero cuando agregué (~) al final: www.example.com/index.php~
, un archivo con el nombre index.php
comenzó a descargarse.
Como han mencionado otros, muchos editores de texto (especialmente Emacs, diría yo) hacen copias de seguridad de las versiones anteriores de los archivos en los que trabaja creando otro archivo cuyo nombre es el mismo que el original pero con una tilde adjunta.
Sin embargo, lo que otras respuestas no han enfatizado lo suficiente es que el hecho de que pueda acceder a un archivo de este tipo es consecuencia de una combinación de control de versión incorrecto o compilación e implementación incorrectas .
Control de versión incorrecto (omisión de archivos "ignorar")
Los sistemas de control de versiones (VCS) tienen mecanismos para configurar un repositorio de modo que los nombres de archivos VCS que coincidan con los patrones especificados se ignorarán. El sistema de control de versiones más popular hoy en día es Git, y su mecanismo para esto es archivos especiales llamados .gitignore
. La mayoría de los repositorios Git de código fuente deberían tener un archivo .gitignore
de nivel superior que tenga esta línea:
*~
Ese es un patrón que le dice a Git que ignore todos los archivos cuyo nombre termina con una tilde. Un error común entre los desarrolladores es no mantener estos archivos diligentemente, o simplemente ignorarlos por completo. Por ejemplo, muchos IDE mostrarán una advertencia cuando encuentren archivos sin seguimiento en su árbol de origen y le darán la opción de decirle al IDE que los ignore. Casi nunca debes usar esa opción; en lugar de eso, descubra qué incluir en el archivo "ignorar" del repositorio para que todos los que lo comprueban se configuren automáticamente para que nunca ingresen estos archivos.
El uso disciplinado de tales archivos de "ignorar" va muy lejos de protegerlo de muchos otros problemas de seguridad. Por ejemplo, pueden ayudarlo a protegerse contra el problema común de los desarrolladores que verifican accidentalmente las credenciales secretas. Una práctica que me ha resultado útil es adoptar un diseño estándar en el que sus proyectos tengan un directorio designado para que los desarrolladores coloquen dichos archivos. Luego puede configurar su repositorio VCS para que los archivos en ese directorio se ignoren, y diseñe su aplicación para que las construcciones de desarrollo obtengan su configuración desde allí.
Procesos incorrectos de compilación y despliegue
La otra cosa que probablemente cause problemas de este tipo es la creación y los procesos de implementación que propagan incorrectamente archivos como el index.php~
en cuestión.
Algunas prácticas que deben adoptarse para evitar esto:
- Haga que su sistema de control de versiones ignore los archivos en primer lugar, como se mencionó anteriormente.
- Tenga un sistema de compilación automatizado que verifique periódicamente su proyecto desde el control de origen, lo compila y empaqueta para su implementación.
- Nunca edite archivos en el directorio de trabajo del sistema de compilación, de modo que su copia del repositorio de origen esté siempre limpia. Siempre observe la disciplina de que los entornos de desarrollador están separados de los entornos de compilación automatizados.
- Nunca compile lanzamientos desde los propios entornos de los desarrolladores.
Otro consejo importante es usar herramientas de construcción probadas en la batalla para construir tus proyectos, que impongan un diseño racional del proyecto y tengan una buena historia sobre cómo identificar qué archivos deben empaquetarse y cuáles no. Las herramientas de compilación para muchos idiomas, por ejemplo, en lugar de simplemente archivar a ciegas todo en su repositorio de origen, copiarán los archivos de forma selectiva en un directorio temporal provisional y luego los archivarán, de modo que solo los archivos que la herramienta seleccionó explícitamente para inclusión incluido.