Para desarrollar una aplicación robusta y segura
es necesario tener en cuenta muchos criterios y recomendaciones.
Entre ellas una de las más importantes consiste en validar
las entradas proporcionadas por los usuarios.
Esto se realiza para evitar ataques comunes de inyección de código
como Cross Site Scripting (XSS) o SQL Injection (SQLi),
pero también puede evitar ataques
de escalado de directorios (Path Traversal),
también conocidos como ataques de directorio transversal.
En un ataque de directorio transversal,
el atacante es capaz de acceder de forma no autorizada
a archivos y carpetas de directorios superiores de la aplicación,
comprometiendo la confidencialidad de la información allí almacenada.
-
Para obtener las rutas absolutas canónicas se puede utilizar
la función getCanonicalPath() de la clase java.io.File
la cual devuelve el nombre de la ruta absoluta canonizada.
La siguiente porción de código muestra la utilización
del procedimiento mencionado anteriormente:
Pathvalidation.scala
import java.io.{File,IOException}
object Main {
def main(args: Array[String]) {
try{
val link_name = "../../../tmp/prueba"
val dirLog= new File( link_name )
println("Path: " + dirLog.getPath())
val canonicalPath = dirLog.getCanonicalPath()
println("Canonical path: " + canonicalPath)
-
La función getCanonicalPath()
se encarga de remover elementos especiales como ., ..
y resolver enlaces simbólicos, alias, shortcuts en todas las plataformas,
devolviendo la versión canónica de la ruta especificada [1].
-
Para el siguiente ejemplo se crea un archivo llamado /tmp/hola
y luego un enlace simbólico a este llamado /tmp/prueba:
-
Para determinar si la ruta ingresada
es un enlace simbólico se realiza lo siguiente [2]:
val file = new File("/tmp/prueba");
println("\nAbsolute path: " + file.getAbsolutePath());
println("Canonical path: " + file.getCanonicalPath());
if (file.getAbsolutePath().equals(file.getCanonicalPath())) {
println("Direccionan la misma ruta");
}
else {
println("Posible link simbólico");
}
}catch{
case e: Exception => println(e);
}
-
Se observa, luego de la ejecución, la siguiente salida:
% java Main
Path: ../../../tmp/prueba
Canonical path: /home/pablo/tmp/prueba
Absolute path: /tmp/prueba
Canonical path: /tmp/hola
Posible link simbólico
-
Aquí se aprecia como se ha transformado la ruta inicial
en su versión canónica y también se ha podido determinar
que el archivo /tmp/prueba es en realidad un enlace simbólico.