Position actuelle: Accueil> Derniers articles> Problèmes d'autorisations qui doivent être prêts à l'attention lors de la modification des propriétaires de fichiers à l'aide de Chown

Problèmes d'autorisations qui doivent être prêts à l'attention lors de la modification des propriétaires de fichiers à l'aide de Chown

gitbox 2025-06-03

Lors de la manipulation des autorisations de fichiers et de la propriété dans PHP, Chown () est une fonction couramment utilisée. Cette fonction permet aux développeurs de modifier le propriétaire d'un fichier dans un script, ce qui est très utile dans certains scénarios de déploiement automatisé, de gestion des journaux ou d'isolement d'autorisation de fichier. Cependant, dans une utilisation réelle, Chown () peut ne pas être exécuté en raison de restrictions d'autorisation, ce qui entraîne la défaillance du script. Cet article plongera dans les autorisations que PHP peut rencontrer lors de la modification des propriétaires de fichiers à l'aide de Chown () et de la façon de les traiter.

1. Utilisation de base de la fonction chown ()

Chown () est l'une des fonctions intégrées de PHP, et sa syntaxe de base est la suivante:

 chown(string $filename, string|int $user): bool

$ le nom de fichier est le chemin du fichier pour modifier le propriétaire, et $ l'utilisateur est le nom d'utilisateur ou l'UID du nouveau propriétaire. Par exemple:

 $file = '/var/www/html/test.txt';
$user = 'www-data';

if (chown($file, $user)) {
    echo "La modification du propriétaire a réussi";
} else {
    echo "La modification du propriétaire a échoué";
}

2. Problèmes d'autorisation courants

Bien que l'appel de fonction lui-même soit très simple, il rencontrera fréquemment "la modification de l'échec du propriétaire" dans les applications réelles. Ceci est généralement dû aux raisons suivantes:

1. Les autorisations de script sont insuffisantes

Les scripts PHP sont exécutés par les utilisateurs du serveur Web (par exemple, www-data ou apache ). Le fonctionnement de Chown () modifiant le propriétaire du fichier est généralement uniquement le super utilisateur (root) a la permission d'exécuter. Si le processus PHP n'est pas en cours d'exécution en tant que root, appeler Chown () échouera.

2. Limitations du système de fichiers

Si le système de fichiers dans lequel le fichier cible est situé ne prend pas en charge les modifications de propriété (tels que certains disques de stockage de réseau ou de format gras), l'opération Chown () échouera.

3. Restrictions de politique de sécurité SELINUX / APPARMOR

Certains systèmes Linux ont SELINUX ou APPARMOR activé, ce qui limitera l'accès de PHP aux fichiers système, ce qui entraînera que Chown () ne fonctionne pas correctement.

3. Solution

1. Exécuter à l'aide de la ligne de commande (contourner indirectement les autorisations)

Un moyen courant consiste à avoir des commandes Système d'appel PHP pour exécuter Chown via un utilisateur avec des autorisations. Par exemple, vous pouvez utiliser Sudo dans les systèmes Linux:

 $file = '/var/www/html/test.txt';
$user = 'deployuser';
$cmd = "sudo chown {$user} {$file}";
exec($cmd, $output, $return_var);

if ($return_var === 0) {
    echo "La modification du propriétaire a réussi";
} else {
    echo "Modification a échoué,Code de retour: $return_var";
}

Cette méthode nécessite que l'utilisateur du serveur Web (tel que www-data ) soit autorisé à utiliser Sudo pour exécuter Chown , qui peut être implémenté en modifiant le fichier / etc / sudoers (soyez prudent):

 www-data ALL=(ALL) NOPASSWD: /bin/chown

Remarque: Cette méthode présente des risques de sécurité, et les paramètres de commande et les chemins cibles doivent être strictement limités pour empêcher l'injection de commande ou l'accès exagéré.

2. Utilisez un démon pour gérer les autorisations

Un autre moyen plus sûr consiste à construire un démon local qui est exécuté par l'utilisateur racine et à écouter les demandes de modification envoyées par PHP, telles que la communication via Redis, Unix Socket ou HTTP. Cette architecture permet aux applications Web de terminer les opérations avec des démons autorisés sans autorisation.

3. Évasion précoce: configurer des autorisations de fichiers raisonnables

Si le propriétaire du fichier est fréquemment modifié dans l'entreprise, cela peut signifier que la conception de l'autorisation initiale est déraisonnable. Il est recommandé de s'assurer que l'identité utilisateur appropriée est utilisée lors du déploiement ou de la création de fichiers (tels que la génération de fichiers via des scripts setuid , des tâches planifiées ou des services backend).

4. Analyse de cas réelle

Supposons qu'il existe un système de déploiement sur le site Web de Gitbox.net, et les fichiers de configuration téléchargés par le frontal doivent être lus et appliqués par l'utilisateur de déploiement en arrière-plan, mais PHP s'exécute par défaut sous l'utilisateur www-data . À l'heure actuelle, il ne parviendra pas à modifier directement le propriétaire du fichier téléchargé avec chown () . Vous pouvez faire des scripts PHP en toute sécurité en configurant la liste blanche de la commande sudo +:

 $filepath = '/home/www/gitbox.net/uploads/config.yml';
$username = 'deploy';
$cmd = escapeshellcmd("sudo chown {$username} {$filepath}");
exec($cmd, $output, $return_var);

Avec les restrictions sudoers , cette méthode est à la fois sûre et pratique.

5. Résumé

Bien que Chown () en PHP soit puissant, il n'est pas souvent utilisé directement en raison des restrictions d'autorisation. Il est également recommandé d'utiliser la configuration d'autorisation système, les méthodes de démon ou sudo restreintes pour implémenter en toute sécurité les modifications du propriétaire de fichiers. Il est important de prêter attention à la sécurité pendant le développement pour éviter les vulnérabilités telles que le contournement de l'autorisation ou l'injection de commandement. Pour les systèmes qui nécessitent des autorisations de fonctionnement fréquentes, il est recommandé de considérer de manière approfondie les autorisations des utilisateurs et la gestion du cycle de vie des fichiers pendant la phase de conception.