En C, usando llamadas POSIX, ¿cómo puedo determinar si una ruta está dentro de un directorio de destino?¿Cómo determinar si una ruta está dentro de un directorio? (POSIX)
Por ejemplo, un servidor web tiene su directorio raíz en /srv
, esto es getcwd()
para el daemon. Al analizar una solicitud para /index.html
, devuelve el contenido de /srv/index.html
.
¿Cómo puedo filtrar las solicitudes de rutas fuera de /srv
?
/../etc/passwd
, /valid/../../etc/passwd
, etc.
Splitting la trayectoria en /
y rechazar cualquier matriz que contiene ..
romperá válido accede /srv/valid/../index.html
.
¿Hay alguna manera canónica de hacer esto con las llamadas al sistema? ¿O necesito caminar manualmente la ruta y contar la profundidad del directorio?
Creo que esta es la razón por la cual 'chroot (2)' se inventó! –
@Carl Norum: chroot es mejor si le das a alguien acceso de shell limitado. si no quieres limitar el acceso a un programa que crees, hay mejores opciones que chroot. – Dani