PHP mkdir: problema di autorizzazione negata


99

Sto cercando di creare una directory con la funzione mkdir PHP, ma ottengo un errore come segue: Warning: mkdir() [function.mkdir]: Permission denied in .... Come risolvere il problema?


2
Piattaforma / server web / sistema operativo?
Salman A

1
controlla questa domanda: http://stackoverflow.com/questions/13908722/php-unable-to-create-a-directory-with-mkdir Stavo avendo lo stesso problema e la risposta qui ha appena risolto il mio problema. Se stai girando su Linux, la risposta su SELinux potrebbe applicarti a te.
Lucas Madureira

Risposte:


171

So che questo è un vecchio thread, ma ha bisogno di una risposta migliore. Non dovresti aver bisogno di impostare i permessi su 777, questo è un problema di sicurezza in quanto dà accesso in lettura e scrittura al mondo. È possibile che il tuo utente apache non disponga dei permessi di lettura / scrittura sulla directory.

Ecco cosa fai in Ubuntu

  1. Assicurati che tutti i file siano di proprietà del gruppo e dell'utente Apache. In Ubuntu è il gruppo e l'utente www-data

    chown -R www-data:www-data /path/to/webserver/www

  2. Successivamente ha consentito a tutti i membri del gruppo www-data di leggere e scrivere file

    chmod -R g+rw /path/to/webserver/www

La mkdir()funzione php ora dovrebbe funzionare senza restituire errori


3
Buona risposta! Si spera che questo raggiunga la parte superiore della pagina nel tempo!
Altamente irregolare


Apache ha bisogno dell'autorizzazione per scrivere cose come cache e log ... è solo una questione di messa a punto.
Manatax

@simpleengine Ciao, ho notato la tua risposta .. Sto affrontando lo stesso problema con un progetto che sto cercando di creare in CodeIgnter e sviluppando in Ubuntu 14.14 Lts .. Potresti spiegarmi in modo più accurato i passaggi che devo fare fare per correggere questo errore ??? Per darti alcune informazioni aggiuntive: il percorso assoluto è /opt/lampp/htdocs/www/my-app/public/uploads.. Fondamentalmente quello che sto cercando di fare è che ogni utente loggato carichi i file all'interno della cartella dei caricamenti e crei anche cartelle di album (questo sarà fatto con php) per archiviare le foto ..
ltdev

5
Non mi piacciono gli utenti che continuano a dire "è insicuro" senza mostrare il modo sicuro per farlo.
che-azeh

38

Risposta tardiva per le persone che lo troveranno tramite Google in futuro. Mi sono imbattuto nello stesso problema.

NOTA: SONO SU MAC OSX LION

Quello che succede è che apache viene eseguito come utente "_www" e non dispone delle autorizzazioni per modificare alcun file. Noterai che NESSUNA funzione del filesystem funziona tramite php.

Come risolvere:

Apri una finestra del Finder e dalla barra dei menu, scegli Vai> Vai alla cartella> / private / etc / apache2

ora apri httpd.conf

trova:

User _www 
Group _www

cambia il nome utente:

User <YOUR LOGIN USERNAME>

Ora riavvia Apache eseguendo questo terminale del modulo:

sudo apachectl -k restart

Se ancora non funziona, mi capita di fare quanto segue prima di fare quanto sopra. Potrebbe essere correlato.

Apri il terminale ed esegui i seguenti comandi: (nota, i file del mio server web si trovano in / Library / WebServer / www. Cambia in base alla posizione del tuo sito web)

sudo chmod 775 /Library/WebServer/www
sudo chmod 775 /Library/WebServer/www/*

6
Questa soluzione funziona, ma consente ad Apache di devastare il tuo sistema nel caso in cui qualcuno gli chiedesse di eseguire codice dannoso (ad esempio attraverso l'exploit Shellshock). Un'alternativa sarebbe lasciare Apache in esecuzione come _wwwe creare un gruppo per te e Apache. Crea un nuovo gruppo, diciamo chiamato trusted, e mettici _wwwdentro. Quindi rendi attendibile il proprietario del gruppo di tutti i file nella directory dei documenti del server. Infine, fai chmod g+rwxquanto necessario solo sui file a cui Apache deve accedere, in modo che il trustedgruppo abbia il permesso di modificare i file.
Chris Middleton

3
solo intervenendo per ribadire che questa risposta è una cattiva idea. ci sono molte ottime ragioni per cui i processi apache sono di proprietà del loro utente speciale.
danyamachine

15

Non impostare i permessi su 777 quando usi mkdir in PHP

Le risposte solo link non sono considerate buone pratiche su StackOverflow, ma il consiglio fornito qui NON dovrebbe generalmente essere seguito.

Vorrei tornare a questa ottima risposta su una domanda simile . Quoto:

Per favore smettila di suggerire di usare 777. Stai rendendo il tuo file scrivibile da tutti, il che significa praticamente perdere tutta la sicurezza per cui è stato progettato il sistema di autorizzazione. Se lo suggerisci, pensa alle conseguenze che potrebbe avere su un server web mal configurato: diventerebbe incredibilmente facile "hackerare" il sito, sovrascrivendo i file. Quindi non farlo.


9

Fissare le autorizzazioni della directory si tenta di creare una directory in .


Ho appena risolto il problema nella domanda originale modificando i permessi del file in 755 in modo ricorsivo, usando Filezilla. Fare clic con il pulsante destro del mouse sulla cartella principale, supponendo che sia una sorta di cartella di repository di file generale su cui è consentito impostare i permessi 755, quindi Attributi file -> Valore numerico -> 755, quindi selezionare "Ricorso alle sottodirectory". Ci vogliono un paio di minuti per propagarsi attraverso le sottodirectory se hai molti file. Quindi riprova.
TARKUS

7

So che questo thread è vecchio, ma forse questo aiuterà qualcuno, un giorno.

Il problema per cui PHP dice "Permission denied" per mkdir () - percorso URL errato. Quindi, per risolverlo, tutto ciò che serve è ottenere il percorso corretto. L'ho fatto in questo modo:

<?php

$root = $_SERVER["DOCUMENT_ROOT"];
$dir = $root . '/somefolder/';

if( !file_exists($dir) ) {
    mkdir($dir, 0755, true);
}

?>

1
Mi è successo durante il trasferimento a un nuovo host (che ha mysqlnd lol). Ho dimenticato di passare al nuovo percorso completo della directory home. È venuto fuori che in realtà non era un problema di autorizzazione.
JSG

2

È necessario disporre dell'autorizzazione del file system per creare la directory.

Esempio: in Ubuntu 10.04 apache (php) viene eseguito come utente: www-data nel gruppo: www-data

Significa che l'utente www-data deve accedere per creare la directory.

Puoi provare tu stesso usando: 'su www-data' per diventare l'utente www-data.

Come soluzione rapida, puoi fare: sudo chmod 777 my_parent_dir


14
chmod 0777darà accesso in lettura e scrittura al mondo! Non dovresti consigliare qualcosa del genere. Tuttavia, il consiglio con il gruppo di utenti è attualmente il migliore qui :)
KingCrunch

1
Se il mondo ha accesso al sistema operativo, certo. Il modo migliore sarebbe: sudo chown www-data: www-data my_parent_dir
Jon Skarpeteig

Oppure lascia le autorizzazioni da sole e aggiungi www-data al gruppo della directory principale.
Marc B

0

L'altra cosa che puoi fare è andare su: / etc / sudoers

Aggiungere la seguente riga che dà il permesso a quell'utente www-data ALL = (ALL: ALL) ALL Perché www-data? questo perché apache è in esecuzione con questo nome utente.

Nel caso in cui il tuo utente sia diverso, prova username ALL = (ALL: ALL) ALL

Questo ha funzionato per me.


5
non modificare sudoersdirettamente, ma accedi come root e usa il visudocomando te : che controlla eventuali modifiche per evitare modifiche errate, che possono causare errori di analisi quando il file sudoers viene caricato, il che potrebbe lasciarti impotente (come in nessun diritto di cambiare qualcosa)
Elias Van Ootegem

Come trovare il nome utente. come www-data? Sto usando nginx ma non lavoro
robspin

1
@robspin prova questo: ps aux | egrep '(nginx)'
maxwells

0

Dato che sei su un Mac, puoi aggiungerti al gruppo _www (il gruppo di utenti Apache) sul tuo Mac:

sudo dseditgroup -o edit -a $USER -t user _www

e aggiungi _www user al gruppo wheel che sembra essere ciò che il Mac crea i file come:

sudo dseditgroup -o edit -a _www -t user wheel

0

Ho questo problema solo ora, la mia migliore soluzione che posso darti in questo momento (nonostante tu non abbia incluso nessuno dei tuoi codici) sarebbe:

  1. Controlla come assegni il nome alla cartella di destinazione, ad esempio: new_folder (a volte questo può causare errori per l'autorizzazione poiché la maggior parte degli host non consente la creazione di nomi che utilizzano trattini bassi, trattini, ecc. In fase di esecuzione). Ha funzionato per me.
  2. Se stavi usando un comando ricorsivo per creare sottocartelle, non dimenticare di mettere 0755 (ricordati di includere 0 all'inizio) nel comando mkdir, ad esempio:

    if(!file_exists($output)){
        if (!mkdir($output, 0755, true)) {//0755
            die('Failed to create folders...');
        }
    
    }

Questo ha funzionato anche per me in questo momento.


3
777 è un problema di sicurezza
MaicolBen

Modificato proprio ora, allo 0755
arungisyadi

0

Se stai usando LINUX, per prima cosa controlliamo l'utente di apache, poiché in alcune distribuzioni può essere diverso:

egrep -i '^user|^group' /etc/httpd/conf/httpd.conf 

Diciamo che il risultato è "http". Fai il seguente, ricorda solo di cambiare path_to_folder in folder path:

chown -R http:http path_to_folder
chmod -R g+rw path_to_folder

0

controlla se non è un problema con umask

if (!function_exists('mkdir_r')) {
    /**
     * create directory recursively
     * @param $dirName
     * @param int $rights
     * @param string $dir_separator
     * @return bool
     */
    function mkdir_r($dirName, $rights = 0744, $dir_separator = DIRECTORY_SEPARATOR) {
        $dirs = explode($dir_separator, $dirName);
        $dir = '';
        $created = false;
        foreach ($dirs as $part) {
            $dir .= $part . $dir_separator;
            if (!is_dir($dir) && strlen($dir) > 0) {
                $created = mkdir($dir, $rights);
            }
        }
        return $created;
    }
}

if (!function_exists('ensure_dir')) {
    /**
     * ensure directory exist if not create 
     * @param $dir_path
     * @param int $mode
     * @param bool $use_mask
     * @param int $mask
     * @return bool
     */
    function ensure_dir($dir_path, $mode = 0744, $use_mask = true, $mask = 0002) {
        // set mask 
        $old_mask = $use_mask && $mask != null
            ? umask($mask)
            : null;
        try {
            return is_dir($dir_path) || mkdir_r($dir_path, $mode);
        } finally {
            if ($use_mask && $old_mask != null) {
                // restore original
                umask($old_mask);
            }
        }
    }
}

0

Dopo aver installato il server ftp con sudo apt-get install vsftpdsarà necessario configurarlo. Per abilitare l'accesso in scrittura è necessario modificare il /etc/vsftpd.conffile e rimuovere il commento dal file

#write_enable=YES

riga, quindi dovrebbe leggere

write_enable=YES

Salvare il file e riavviare vsftpdcon sudo service vsftpd restart.

Per altre opzioni di configurazione consultare questa documentazione oman vsftpd.conf


0

Questo errore si verifica se stai utilizzando il percorso sbagliato.

Ad esempio:

Sto usando il sistema Ubuntu e il nome della cartella del mio progetto è "myproject"

Supponiamo che esista la directory myproject / public / report e di voler creare una nuova cartella chiamata orders

Allora ho bisogno di un intero percorso in cui esiste il mio progetto. È possibile ottenere il percorso tramite il comando PWD

Quindi il mio percorso di root sarà = '/ home / htdocs / myproject /'

$ dir = '/ home / htdocs / mioprogetto / public / report / Orders';

if (!is_dir($dir)) {
   mkdir($dir, 0775, true);
}

Funzionerà per te !! Godere !!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.