bonjour je cherche a créé des dossier et des fichier en php.
problème une foi créé (par php ) les fichier son accessible en lecture malgré

mkdir($dirname, 0777, true);

il les enregistre quand meme avec les droit 0755 et refuse de le supprimer avec

rmdir($dirname)

auriez vous une idée pour qu'il enregistre effectivement mes fichier en 0777 ?

merci d’avance

Edit : j'ai trouvé sa

umask(0);

mais si vous avez mieux je prend car sa simule les droit root pour tous le code qui suis point de vue sécurité ses pas top

13 réponses


Bonsoir,

Il me semble que le dossier parent doit aussi être en 777, avez-vous vérifier cela ?

exec() / system()

boolgy
Auteur

Carouge oui j'ai vérifier il est bien en 0777. le probleme ne vient pas de la

Glaived je ne cherche pas a exécute un programme externe donc a par créé mes fichier en ligne de commande je ne voie pas l’intérêt de ses deux fonction dans mon cas. créé mes fichier en ligne de commande n'a pas beaucoup d’intérêt vu que PHP est sensé savoir le faire en php seul.

salut tu peux utiliser ma fonction makedir ci-dessous elle devrait regler le probleme

/**
   * Determine whether or not a path exists in the filesystem. This differs from
   * file_exists() in that it returns true for symlinks. This method does not
   * attempt to resolve paths before testing them.
   *
   * @param string Test for the existence of this path.
   * @return bool True if the path exists in the filesystem.
   * @task path
   */
 function pathExists($path) {
            defined('DS') or define('DS',DIRECTORY_SEPARATOR);
      $path =rtrim(preg_replace('#/\\\\]+#', DS, $path), DS);
    return file_exists($path)|| is_dir($path) || is_link($path);
  }
/**
* Create a directory structure recursively. Can be used to create
* deep path structures like `/foo/bar/baz/shoe/horn`
*
* @param string $pathname The directory structure to create
* @param integer $mode octal value 0705
* @return boolean Returns TRUE on success, FALSE on failure
*/
 function makedir($pathname, $mode = 0705) {
           defined('DS') or define('DS',DIRECTORY_SEPARATOR);
      $pathname = rtrim(preg_replace('#/\\\\]+#', DS, $pathname), DS);
      if(pathExists($pathname)) return true;
      $pathname = rtrim($pathname, DS);
      $nextPathname = substr($pathname, 0, strrpos($pathname, DS));
      if ( __FUNCTION__ ($nextPathname, $mode)) {
          if (!pathExists($pathname)) {
              $old = umask(0);
              if (mkdir($pathname, $mode)) {
                  umask($old);
                  return true;
              }
              umask($old);
              return false;
          }
      }
      return false;
  }
boolgy
Auteur

oui elle réglerais le problème puis qu'elle utilise umask sauf que comme dit plus au umask donne les droit root au code se qui serait une faille de sécurités pour le serveur

voici ma function actuel qui utilise aussi umask

function creeDossier($dirname, $droit = 0777) {
    $lastMask = umask(0);
    if (file_exists($dirname)) {
        if ($this->RmDir($dirname)) {// RmDir= autre function supprimant les sous dossier et sous fichier avent de supprimer le fichier 
             $res = mkdir($dirname, $droit, true);
             umask($lastMask);
             return $res;
        }
    }
    else {
        $res = mkdir($dirname, $droit, true);
        umask($lastMask);
        return $res;
    }
}

j'ai limité l'impacte du umask en remettant le mask par defaut apres création du dossier mes je préférai évité d'utilisé les umask si ses possible

ou est-ce que tu trouve les droits root toi? sur un serveur web les droits sont ceux du user apache pas du root

si tu crée des fichier et n'arrive plus à les supprimer c'est suremment un probleme de chown
donc un ls -la en ssh te permettra de voir ce qui se passe

quel est user propriétaire des fichiers de ton repertoire web? quels des sont les droits d'apache dans ce repertoire

boolgy
Auteur

effectivement le problème se situe au niveau des droit d’accès au fichier que PHP créé (comme dit au premier message sans le umask le fichier créé est de droit 0755)

"ou est-ce que tu trouve les droits root toi? sur un serveur web les droits sont ceux du user apache pas du root"

à moin que j'ai mal compris le principe d'umask. Il change l'user masque de php pour exécuté le code avec un autre user. En mettant umask(0), zéro étant le masque du root, on exécute le code qui suis comme étant un user root ce qui explique que avec çà le problème de droit saute. (si ses pas sa alors si vous pouviez m'expliqué se serais sympas)

Bonjour,

Umask n'a jamais servi à changer un user il s'occupe des permissions par défaut lors de la création de fichier et / ou dossier, pour changer d'user il faut faire un chown. Mais pour executer un fichier avec les droits root il faut que tu fasse un sudo.

Cordialement

boolgy
Auteur

Ok je vous ai déranger pour rien alors. veilliez m'en excusez

comment tu fait un sudo en php ? et chown change le propriétaire du fichier pas l'user qui tente de l’exécuté.

Bonsoir,

Je parlais du propriétaire et group pour le chown bien sur, pour faire un sudo en php il faut que tu passe par les fonctions que t'a montré glaived, mais il faut que tu autorise ton user à pouvoir faire un sudo.

Cordialement

salut
juste pour savoir s'agit-il d'un serveur en production(hebergement) ou de ton serveur de dev? jai deja eu le meme pb sur un de mes serveurs et apres des recherches, il s'agissait d'un probleme lié à ma configuration de vsftpd.
car les fichiers crées appartenaient au user ftp et apache avait des d'ecriture lecture et execution sur le reperrtoire web, mais à cause du bit de controle, il ne pouvait pas les supprimer.
j'ai reglé ce probleme en ajoutant le user apache au groupe ftp et en designant comme proprietaire des fichiers le user apache du group ftp. avec un umask=072

boolgy
Auteur

pour répondre a la question mon serveur est celui de dev qui as exactement la même config que celui de prod. on revient toujour sur le umask donc je pence que je vais gardé ma fonction tel quel est merci de votre aide