Tengo una implementación de servidor Java (TFTP si es importante para usted) y me gustaría asegurarme de que no sea susceptible a los ataques de ruta transversal que permitan el acceso a archivos y ubicaciones que no deberían estar disponibles.¿Cuál es la mejor manera de defenderse contra un ataque transversal de ruta?
Mi mejor intento de defender hasta el momento es rechazar las entradas que coincidan con File.isAbsolute()
y luego se basan en File.getCanonicalPath()
para resolver cualquier componente ../
y ./
fuera de la trayectoria. Por último, me aseguro de que la trayectoria resultante es todavía dentro del directorio raíz requerido de mi servidor:
public String sanitize(final File dir, final String entry) throws IOException {
if (entry.length() == 0) {
throw new PathTraversalException(entry);
}
if (new File(entry).isAbsolute()) {
throw new PathTraversalException(entry);
}
final String canonicalDirPath = dir.getCanonicalPath() + File.separator;
final String canonicalEntryPath = new File(dir, entry).getCanonicalPath();
if (!canonicalEntryPath.startsWith(canonicalDirPath)) {
throw new PathTraversalException(entry);
}
return canonicalEntryPath.substring(canonicalDirPath.length());
}
¿Hay problemas de seguridad que esto pasa por alto? ¿Hay mejor/más rápido para lograr el mismo resultado de manera confiable?
El código debe funcionar de forma coherente en Windows y Linux.
No olvide prohibir el acceso a los dispositivos especiales de Windows (NUL, COM1, etc.) que están presentes en todas partes en el sistema de archivos. –
Bien pensado Heath. El siguiente enlace parece tener una lista definitiva de los nombres de archivo reservados de Windows: http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx –
¿Por qué no puede configurar esto en su Servidor Apache/IIS en su lugar? – kikito