realpath secure ?

Dans le cadre d’une application serveur (type transfert de fichier : http, ftp, …), pour contrôler l’accès aux fichiers j’utilise realpath(3). Cette fonction permet d’avoir le path (chemin) réel d’un fichier, sans lien relatif dans un des dossiers. Ainsi on a juste à faire un strncmp(3) pour le comparer à la racine de l’application.

Par exemple une partie du code du serveur HTTP que je suis en train de coder (uri est quelque chose de la forme /../foo/bar/../machin.html et conf_root la racine du style /usr/local/www/

char path[PATH_MAX];
char root[PATH_MAX];
if (!realpath(uri+1, path) ||
!realpath(conf_root, root) ||
strncmp(path, root, strlen(root)) != 0)
return send_error(404);

Prenez ce post pour une question, à part le chroot(2) et realpath, comment bien contrôler l’accès aux fichiers ?

J’y connais rien en filesystems, mais si on pouvait avoir un moyen rapide de savoir si un fichier est dans tel ou tel fichier ce serait grandement pratique. Sans me vanter j’ai souvent des idées géniales en informatique, mais bien souvent ça a été pensé et implémenté depuis plus de 10 ans ! Du coup si vous avez plus d’information, je suis prêt à converser sur ce sujet avec vous…