49 votes

Vérifiez si l'utilisateur est root en C?

Comment puis-je vérifier si l'utilisateur est root?

68voto

R.. Points 93718

Généralement c'est une erreur de test si l'utilisateur est root. POSIX n'a même pas besoin d'un super-utilisateur, mais laisse à la mise en œuvre afin de déterminer comment les autorisations de travail. Le Code tel que:

if (i_am_root) do_privileged_op(); else print_error();

va vraiment gêner les utilisateurs avancés privilège des modèles où la racine n'est pas nécessaire d'effectuer les opérations privilégiées. Je me souviens que dans les premiers jours de gravure de cd sous Linux, j'ai eu à pirater tous les plus de la cdrecord source à supprimer tout ce qui est inutile, vérifie si elle était en cours d'exécution en tant que root, quand il a très bien fonctionné avec la permission de lire /dev/sga.

Au lieu de cela, vous devez toujours tenter l'opération privilégiée vous avez besoin pour effectuer et vérifier s' EPERM ou similaire si elle ne parvient pas à signaler à l'utilisateur qu'ils ont des privilèges insuffisants (et peut-être devrait réessayer en cours d'exécution en tant que root).

Le seul cas où il est utile de vérifier la racine est de vérifier si votre programme était appelé "suid-root". Un raisonnable serait:

uid_t uid=getuid(), euid=geteuid();
if (uid<0 || uid!=euid) {
    /* We might have elevated privileges beyond that of the user who invoked
     * the program, due to suid bit. Be very careful about trusting any data! */
} else {
    /* Anything goes. */
}

Note que j'ai laissé la possibilité (tiré par les cheveux, mais mieux vaut être parano) que ce soit des appels pour obtenir des uid/uid effectif risque d'échouer, et que, dans le cas d'échec nous devons supposer que nous sommes suid et un utilisateur malveillant a en quelque sorte causé les appels à l'échec dans une tentative de cacher que nous sommes suid.

45voto

Matthew Flaschen Points 131723

getuid ou geteuid , selon ce que vous voulez vraiment dire. Dans les deux cas, 0 signifie racine.

 if(geteuid() != 0)
{
  // Tell user to run app as root, then exit.
}
 

La remarque de R est valable. Vous devriez envisager les essais et erreurs, ou une autre approche qui ne requiert pas explicitement root.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X