2010-01-05 10 views
2

Je travaille en php sur Ubuntu. Lorsque j'utilise une image sur une page Web qui a refusé l'accès, il y a un avertissement sur la page. Je veux vérifier avant d'afficher et si elle n'a pas les droits d'ouvrir puis lui donner accès à ouvrir. Comme nous le faisons en commande terminale.Comment vérifier si un fichier a un accès refusé et comment donner des droits (777) à un fichier en php?

chmod 777 myimage.jpg 

Comment vérifier cela et donner un accès complet à un fichier dans php.

Merci

Répondre

8

Vérifiez la fonction is_readable() et is_writable().

Exemple:

$filename = '/home/myuser/example.txt'; 

if (is_readable($filename) && is_writable($filename)) 
{ 
    echo "File has read and write permissions."; 
} 
+0

Vous n'avez pas discuté de donner l'accès à un fichier en utilisant chmod. – NAVEED

+0

Vous ne pouvez pas chmod() un fichier si le serveur n'est pas le propriétaire. Et définir la permission 777 sur un fichier est vraiment une mauvaise idée. La seule façon de donner à votre serveur un accès complet aux images consiste à utiliser un formulaire de téléchargement de fichier image que PHP (serveur) enregistre dans le système de fichiers. De cette façon, le fichier image est créé par le serveur, donc le propriétaire. – rogeriopvl

+0

Oui, je veux la même chose. Dans mon cas, un utilisateur ajoute sa photo à son profil Ensuite, le serveur doit être propriétaire de cette image. Mais l'image n'est pas lisible après le téléchargement. Cela signifie que le serveur peut modifier les droits d'accès après le téléchargement? – NAVEED

2

Utilisez is_readable() pour vérifier si le fichier ou non lisible par le processus PHP.

Utilisez chmod() pour modifier les autorisations du fichier.

En outre, vous pouvez utiliser is_writable() pour tester si vous pouvez écrire dans le fichier et file_exists() pour vérifier si le fichier existe même.

+0

J'ai cette erreur quand j'utilise la fonction chmod: chmod() [function.chmod]: Opération non autorisée. – NAVEED

+0

Pour utiliser chmod, le serveur Web doit être le propriétaire du fichier, sinon vous obtiendrez cette erreur. – rogeriopvl

1

Faire cela à la volée depuis PHP à chaque fois qu'un fichier est référencé est une manière très inefficace de gérer vos fichiers. Cela nécessite également que tous les accès aux fichiers soient médiatisés via un script PHP. En outre, permettre au contenu d'être accessible en écriture est plutôt désordonné du point de vue de la sécurité.

Je voudrais exécuter un script d'administration une fois pour ranger les autorisations pour vos fichiers existants, puis résoudre le problème lorsque de nouveaux fichiers entrent dans le système. Bien sûr, si vous n'avez pas d'accès shell/accès shell comme quelqu'un d'autre que l'uid du serveur web, alors vous devrez l'implémenter en utilisant PHP (et donc readdir/is_readable/is_writeable). Sans savoir comment les fichiers apparaissent sur votre serveur Web, il est difficile de recommander une solution spécifique.

C.

2

Une chose que vous pouvez faire est d'utiliser la fonction fileowner (et posix_getpwuid) et de comparer à tout ce qui est (souvent www-data) votre utilisateur PHP.

Si les utilisateurs sont les mêmes, vous pourrez modifier les autorisations si nécessaire. Mais vérifiez d'abord si le fichier est inscriptible de toute façon. UPDATE: les fonctions chmod et chown renvoient TRUE en cas de succès et FALSE en cas d'échec, il serait donc judicieux de les placer dans une clause if.Vous pouvez supprimer la sortie d'erreur en mettant error_reporting(0); au début du script, ou en utilisant le symbole @ comme ceci:

if (@chmod($filename, 0666)) { 
    // do whatever with file 
} 
else if (@chown($filename, 1000)) { 
    chmod($filename, 0666); 
    // do whatever with file 
} 
else { 
    // can't change permissions 
} 
+0

Est-il possible de donner un accès complet à un fichier en utilisant la méthode chmod après avoir connu le propriétaire du fichier. Même dans ubuntu, quand je suis connecté en tant qu'administrateur et que j'ai tous les droits, je dois entrer un mot de passe sur le terminal pour pouvoir accéder en utilisant sudo. – NAVEED

+0

Je ne pense pas qu'il existe une fonction PHP pour faire cela, mais vous pouvez essayer la fonction 'exec' qui vous permet d'exécuter des commandes sur le serveur. http://php.net/manual/en/function.exec.php – DisgruntledGoat

0

Une chose que vous pouvez faire pour rendre le fichier lecture/écriture est de appeler cette fonction sur fichier/dossier création sans le second argument:

function AutoChmod($path, $chmod = null) 
{ 
    if (file_exists($path) === true) 
    { 
     if (is_null($chmod) === true) 
     { 
      $chmod = (is_file($path) === true) ? 644 : 755; 

      if (in_array(get_current_user(), array('apache', 'httpd', 'nobody', 'system', 'webdaemon', 'www', 'www-data')) === true) 
      { 
       $chmod += 22; 
      } 
     } 

     return chmod($path, octdec(intval($chmod))); 
    } 

    return false; 
} 

Exemple:

AutoChmod('/path/to/file/you/just/created.txt'); 

Cette fonction donnera une autorisation appropriée si vous travaillez avec SuPHP/SuExecPHP ou non.


Pour vérifier les autorisations que vous avez juste besoin d'utiliser les fonctions is_readable() et is_writable().