Autorizzazione file_put_contents negata


97

Sto cercando di scrivere una query su un file per il debug. Il file è in formato database/execute.php. Il file su cui voglio scrivere è database/queries.php.

Sto cercando di usare file_put_contents('queries.txt', $query)

Ma sto ottenendo

file_put_contents (queries.txt) [function.file-put-content]: impossibile aprire il flusso: autorizzazione negata

Ho il queries.txtfile modificato in 777, quale potrebbe essere il problema?


Hai esaminato il php.inifile per qualcosa che potrebbe negare l'accesso al file?
Hello71

2
assicurati anche che la directory sia modificata correttamente
Crayon Violent

1
prova anche a usare il nome file assoluto. Potrebbe essere che la tua interpretazione della cartella corrente sia diversa da quella di PHP
laher

1
Puoi ricontrollare lo stato di chmod?
Giona

1
C'è una lista di controllo per la risoluzione dei problemi di questo tipo di problemi: stackoverflow.com/questions/36577020/...
Vic Seedoubleyew

Risposte:


72

Prova a modificare le autorizzazioni della directory.

da un terminale, esegui chmod 777 database(dalla directory che contiene la cartella del database)

apache e nessuno avrà accesso a questa directory se è impostata correttamente.

L'altra cosa da fare è echo "getcwd ()". Questo ti mostrerà la directory corrente e, se questo non è "/ qualcosa .../database/", dovrai cambiare "query.txt" con il percorso completo del tuo server.


104
777 non è un rischio per la sicurezza?
hitautodestruct

12
Sospetto fortemente che non solo la directory di destinazione debba essere scrivibile dall'account del server, ma ogni directory principale della directory di destinazione deve consentire all'account del server di navigare in essa; Penso che questo sarebbe + x alle autorizzazioni.
Erhannis

2
Ho sperimentato le teorie di Erhannis su un nuovo stack LAMP e la teoria è giusta.
thotheolh

4
@MajidFouladpour penso chmod +x /parent/directory, per ogni directory padre della destinazione. chmod +x /parent/directory, chmod +x /parentecc.
Erhannis

1
V'è ora una lista di controllo per la risoluzione dei problemi di questo tipo di problemi: stackoverflow.com/questions/36577020/...
Vic Seedoubleyew

18

L'altra opzione

è che puoi creare Apache (www-data), il proprietario della cartella

sudo chown -R www-data:www-data /var/www

dovrebbe file_put_contentsfunzionare ora. Ma per una maggiore sicurezza è meglio impostare anche le autorizzazioni come di seguito

find /var/www -type d -print0 | xargs -0 chmod 0755 # folder
find /var/www -type f -print0 | xargs -0 chmod 0644 # files
  • passare /var/wwwalla cartella principale dei file php

7

Renditi conto che è piuttosto vecchio ora, ma non è necessario scrivere manualmente query su un file come questo. MySQL ha il supporto per la registrazione integrato, devi solo abilitarlo nel tuo ambiente di sviluppo.

Dai un'occhiata alla documentazione per il "log delle query generali":

http://dev.mysql.com/doc/refman/5.1/en/query-log.html


3

Ragazzi, ho avuto questo problema per 1 mese e ho fatto tutto ma non sono riuscito a risolverlo, ma ora conosco la soluzione.

Uso un hosting Linux condiviso, quando il mio amministratore ha cambiato php in 5.3 ho ricevuto molti errori per il codice "file_put_contents". prova a testare il mio piano:

Nel tuo host crea un file come mytest.php, inserisci questo codice e salva:

<?php        mail('Your-EMail','Email-Title','Email-Message');        ?>

Apri l'URL "www.tuo-dominio.com/mytest.php" una volta e controlla la posta. dovresti ricevere un'e-mail dal tuo host con le informazioni che hai inserito in mytest.php, controlla il nome del mittente. se è di Nessuno hai problemi con "Permission Denied" perché qualcosa non è definito e se il nome del mittente è come il mio id: iietj8qy@hostname5.netly.net non hai prob.

Il mio amministratore ha cambiato il server e installato di nuovo l'host, penso e il problema è stato risolto, dì alla tua amministrazione host quello che ti ho detto e forse troveranno la risposta.

spero che ti aiuti!


Sono completamente perso !! Cosa stai cercando di dire? Se stai dicendo che l'utente apache non è stato in grado di ottenere il nome host sul server (condiviso o altro), allora è giunto il momento di riconsiderare la tua scelta di un servizio di hosting.
Fr0zenFyr

3

So che è una domanda molto vecchia, ma volevo aggiungere la buona soluzione con qualche spiegazione approfondita. Dovrai eseguire due istruzioni su sistemi simili a Ubuntu e poi funzionerà a meraviglia.

Le autorizzazioni in Linux possono essere rappresentate con tre cifre. La prima cifra definisce l'autorizzazione del proprietario dei file. La seconda cifra le autorizzazioni di un gruppo specifico di utenti. La terza cifra definisce le autorizzazioni per tutti gli utenti che non sono il proprietario né il membro del gruppo.

Il server web dovrebbe essere eseguito con un id che è un membro del gruppo. Il webserver non dovrebbe mai funzionare con lo stesso ID del proprietario dei file e delle directory. In Ubuntu viene eseguito Apache con l'id www-data. Quell'ID dovrebbe essere un membro del gruppo per il quale sono specificate le autorizzazioni.

Per dare alla directory in cui si desidera modificare il contenuto dei file i diritti appropriati, eseguire l'istruzione:

find %DIR% -type d -exec chmod 770 {} \;

Ciò implicherebbe nella questione dell'OP che i permessi per la directory% ROOT% / database dovrebbero essere modificati di conseguenza. È quindi importante non avere file all'interno di quella directory che non dovrebbero mai essere modificati o rimossi. È quindi buona pratica creare una directory separata per i file il cui contenuto deve essere modificato.

I permessi di lettura (4) per una directory significa essere in grado di raccogliere tutti i file e le directory con i loro metadati all'interno di una directory. I permessi di scrittura (2) danno il permesso di cambiare il contenuto della directory. Implicando l'aggiunta e la rimozione di file, la modifica dei permessi, ecc. Il permesso di esecuzione (1) significa che hai il diritto di entrare in quella directory. Senza quest'ultimo è impossibile approfondire la directory. Il server web necessita di autorizzazioni di lettura, scrittura ed esecuzione quando il contenuto di un file deve essere modificato. Quindi ha bisogno del gruppo la cifra 7.

La seconda affermazione è nella questione del PO:

find %DOCUMENT_ROOT%/database -type f -exec chmod 760 {} \;

È necessario essere in grado di leggere e scrivere un documento, ma non è necessario per eseguire il file. Il 7 è dato al proprietario dei file, il 6 al gruppo. Il server web non ha bisogno dell'autorizzazione per eseguire il file per modificarne il contenuto. Quelle autorizzazioni di scrittura dovrebbero essere assegnate solo ai file in quella directory.

A tutti gli altri utenti non dovrebbe essere concessa alcuna autorizzazione.

Per le directory che non richiedono di modificare i propri file, sono sufficienti 5 autorizzazioni di gruppo. Documentazione sui permessi e alcuni esempi:

https://wiki.debian.org/Permissions

https://www.linux.com/learn/tutorials/309527-understanding-linux-file-permissions

http://www.linux.org/threads/file-permissions-chmod.4094/


3

La raccolta di informazioni da questo collegamento salva immagine stackoverflow non funziona con chmod 777 e dall'utente azerafati e Loek Bergman

se dovessi guardare nel file / etc / apache / envvars vedrai qualcosa del tipo:

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

Apache viene eseguito con il nome utente "www-data"

"0755" significa che il proprietario del file può leggere / scrivere / eseguire ma il gruppo e gli altri utenti non possono scrivere. quindi nel tuo terminale, cd nella cartella contenente la tua cartella "immagini". quindi digitare:

find images -type d -exec chmod 0755 {} \;
find images -type f -exec chmod 0755 {} \;
sudo chown -R www-data:www-data images

è necessario modificare le condizioni prima di cambiare proprietario. inserisci la tua password quando richiesto. questo renderà "www-data" il proprietario della cartella delle immagini.

il tuo caricamento ora dovrebbe funzionare.


1

Per chiunque utilizzi Ubuntu e riceva questo errore durante il caricamento della pagina in locale, ma non su un servizio di web hosting,

Ho appena risolto il problema aprendo nautilus ( sudo nautilus) e facendo clic con il pulsante destro del mouse sul file che stai tentando di aprire, fai clic su proprietà> Impostazioni> e dai la lettura e la scrittura a "tutti gli altri"


0

ha avuto lo stesso problema; il mio problema era che selinux era impostato per far rispettare.

Continuavo a ricevere l'errore "Impossibile aprire il flusso: autorizzazione negata" anche dopo il chmoding su 777 e assicurandomi che tutte le cartelle principali avessero i permessi di esecuzione per l'utente apache. Si scopre che il mio problema era che selinux era impostato per applicare (sono su centos7), questo è un devbox quindi l'ho spento.


0

Questo può essere risolto in risolto con i seguenti passaggi:

1. $ php artisan cache:clear

2. $ sudo chmod -R 777 storage

3. $ composer dump-autoload

Spero che sia d'aiuto


0

Se esegui il pull da git da locale a server, dovrai svuotare la cache a volte a causa dei file di visualizzazione che vengono caricati con esso / o altri file memorizzati nella cache.

php artisan cache:clear

A volte potrebbe essere solo un trucco se la tua applicazione funzionava prima del pull git


0

questo potrebbe aiutare. Ha funzionato per me. provalo nel terminale

setenforce 0


-2

Ci sono 2 modi per risolvere questo problema
1. utilizzare chmod 777 path-to-your-directory.
se non funziona,
2. fornisci semplicemente il percorso completo del tuo file query.txt.


2
Questa è una pratica terribilmente insicura ed estremamente cattiva. È anche difficile da rilevare e correggere durante lo sviluppo di applicazioni personalizzate e può essere facilmente trascurato. Per favore, individua le autorizzazioni giuste.
ftrotter

-3

Ecco la soluzione. Per copiare un'immagine da un URL. questo URL:http://url/img.jpg

$image_Url=file_get_contents('http://url/img.jpg');

creare il percorso desiderato finire il nome con .jpg

$file_destino_path="imagenes/my_image.jpg";

file_put_contents($file_destino_path, $image_Url)

-11

Inoltre, come detto in file_put_contents man pagea php.net, attenzione di nominare problemi.

file_put_contents($dir."/file.txt", "hello");

potrebbe non funzionare (anche se è corretto sulla sintassi), ma

file_put_contents("$dir/file.txt", "hello");

lavori. L'ho sperimentato su diversi server installati in php.


17
Questo non è corretto. $dir."/file.txt"è funzionalmente equivalente a "$dir/file.txt"in tutti i casi, assumendo $dirsia una stringa. Inoltre, questo comportamento non è documentato su php.net, come afferma Kivanc.
mattbasta
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.