Newsgroup: it.comp.www.php
Titolo: Problemi con fwrite e permessi

Ho un codice del genere ... ma l'unico problema è che non riesco a scrivere
i file ... forse per un problema di permessi.
In pratica $filename contiene il nome del file che però non esiste e deve
essere creato e $somecontent contiene il testo da inserirci.
Il codice deve (dovrebbe) essere corretto ma non riesco a creare il file a
causa di un problemi di permessi.
che permessi devo settare alla cartella e al file??? (hosting linux)
Grazie
if (is_writable($filename)) { 
   if (!$handle = fopen($filename, 'w')) { 
        print "Cannot open file ($filename)"; 
        exit; 
   } 
   if (!fwrite($handle, $somecontent)) { 
       print "Cannot write to file ($filename)"; 
       exit; 
   } 
    print "Success, wrote to file ($filename)"; 
 
   fclose($handle); 
 
} else { 
   print "The file $filename is not writable"; 
} 
?>
-- 
Francesco 'Imperator' Ricci [FIAG Member] {09/06/2004 8.58.00}
WWW.UNDERGROUNDSECURITY.NET
 ... Sicurezza Informatica e non solo...
«»Meglio esserci lasciati che non esserci mai incontrati«» KEKKA TVB :o*
ICQ 168442149 / MSN 
imp3...@libero.it
 / MAIL 
impe...@despammed.com

 che permessi devo settare alla cartella e al file??? (hosting linux)
Ma ti dà errore? o ti printa che non è scrivibile?
ste

 ha scritto nel messaggio
news:xLzxc.28954$G%.17775@tornado.fastwebnet.it...

Perchè quello che penso io, è che, indipendentemente dai permessi della
cartella, se il file non esiste allora la funzione is_writable() ti
restituirà sempre false,
Comunque in generale per scrivere un file la cartella che lo contiene deve
avere i permessi a 777
ste

 avere i permessi a 777
? e perche' ?
Non basterebbe dare i permessi di scrittura solo all'utente con cui gira il
www-service?
chmod 777 mi sembra eccessivo che dici? ;-)
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (
http://www.grisoft.com
).
Version: 6.0.700 / Virus Database: 457 - Release Date: 06/06/2004

 chmod 777 mi sembra eccessivo che dici? ;-)
e quindi com'è il valore?
ste

 ste
Beh... dipende. 
chmod 600 basta per dare read e write al propietario del file.
Potresti anche esagerare e dare un 666 cosi' metti in condizione di
leggere e scrivere su quel file tutti!!!
Il 777 da anche il permesso di "eseguire" il file, e non solo al
propietario ma anche a tutti quelli che appartengono al gruppo, e persino
a chiunque altro, e non e' una bella cosa in fatto di sicurezza.
Ciao.

 leggere e scrivere su quel file tutti!!!
quindi basta 666 anche per la cartella? ok nn lo sapevo..
grazie,
ste

 quindi basta 666 anche per la cartella? ok nn lo sapevo..
Esatto. Ciao.
Ti do un consiglio. Bisogna avere sempre un occhio di riguardo per quanto
riguarda la sicurezza.
Un sito web per quanto bello e spettacolare possa essere e' una porta
spesso molto fragile dalla quale un malintenzionato puo' entrare e far
danni, e' meglio spendere qulache attimio per controlalre che non vengano
lasciati buchi...
Ciao.

 leggere e scrivere su quel file tutti!!!
a me da
Internal Server Error
-- 
Francesco 'Imperator' Ricci [FIAG Member] {09/06/2004 17.10.58}


 Internal Server Error
Ma hai verificato la mia soluzione??
ste

 Ma hai verificato la mia soluzione??
Certo.
755 -> The file a is not writable (Non ha i permessi)
600 -> Forbidden You don't have permission to access /link/write.php on
this server.
666 -> Forbidden You don't have permission to access /link/write.php on
this server.
777 -> Internal Server Error The server encountered an internal error or
misconfiguration and was unable to complete your request. Please contact
the server administrator, 
imper...@xxxxx.it
 and inform them of the time
the error occurred, and anything you might have done that may have caused
the error. More information about this error may be available in the server
error log.
Che devo fare???
-- 
Francesco 'Imperator' Ricci [FIAG Member] {10/06/2004 9.40.13}


 this server.
non mi riferivo ai permessi ma alla funzione is_writable e poi non ci hai
detto se ti dava un warning o se ti printava il tuo errore, vabbč...
ste

 detto se ti dava un warning o se ti printava il tuo errore, vabbè...
Ma allora se io voglio creare un file con php come posso fare?
-- 
Francesco 'Imperator' Ricci [FIAG Member] {10/06/2004 14.31.09}


 Ma allora se io voglio creare un file con php come posso fare?
Indipendentemente dai permessi, problema che poi si può verificare, il punto
è che secondo me per prima cosa sbagli a verificare se è scrivibile un file
che ancora non esiste, giustamente la funzione is_writable non potendo
verificare ciò, restituisce false.
Togli quel controllo che tanto in questo caso è più dannoso che altro.
Per quanto riguarda i permessi, se hai la possibiltà di agire via ftp sulla
cartella in cui scrivi, cambia i permessi impostandoli, ancora a mio avviso,
su 777, dico così perchè ho provato a fare come ha detto Davide ma ha dato
errore anche a me. Ricorda che se il file si trova in delle sottocartelle
anche le sottocartelle dovranno avere gli stessi permessi della dir
superiore. Se invece crei tu la dir da php ricordati di usare mkdir
("tua_dir", 0777) in modo da settare i permessi alla dir.
ora verrò sicuramente smentito, per i problemi di sicurezza, ma a me così
funziona anche se, per il target di siti che sviluppo, non mi sono mai
dovuto scontrare con problemi di sicurezza.
ste

 Internal Server Error
Ma tu hai provato chmod 666 oppure 600?
Con 600 dai la possibilita' di leggere e scrivere il file solo al
propietario e agli altri nulla, con 666 invece dai la possibilita' di
leggere e scrivere a tutti.
Con 600 se hai problemi vuoldire che chi crea il file non e' lo stesso
utente con cui gira il webserver, erore molto comune, pero' con 666 deve
funzionare.
Tieni presente che 777 a differenza di 666 da semplicemente la possibilita'
al file di essere "eseguito" quindi non vedo perche' con 777 dovrebbe
funzionare e con 666 no visto che tu ci devi semplicemente scrivere e
leggere.
es.
debian:~# chmod 777 prova
debian:~# ls -la prova
-rwxrwxrwx    1 root     root           59 Apr  8 21:27 prova
Come puoi vedere hai rwx (Read Write eXecute) su tutte e tre le sezioni
Owner Group e Other
mentredebian:~# chmod 666 prova
debian:~# ls -la prova
-rw-rw-rw-    1 root     root           59 Apr  8 21:27 prova
vedi che Owner Group e Other hanno tutti rw (Read e Write)
Perche' un file dovrebbe essere esguibile per poter scriverci sopra?
Come puoi vedere il file prova e' dell'utente root e se io facessi chmod 600
prova otterrei:
debian:~# chmod 600 prova
debian:~# ls -la prova
-rw-------    1 root     root           59 Apr  8 21:27 prova
Ovviamente adesso se l'utente pippo cerca di leggere o scrivere il file non
potrebbe dato che Read e Write l'ho dato solo all' Owner che in questo caso
e' root.
Morale della favola se scarico prova in ftp probabilmente l'Owner di prova
sara' qualcosa tipo ftp-user e se Apache (o qualsiasi altro webserver) gira
per esempio con Owner www-data ovviamente ti si presenta il problema di cui
parlavo prima.
Spero di aver fatto chiarezza ^__^
Ciao.
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (
http://www.grisoft.com
).
Version: 6.0.701 / Virus Database: 458 - Release Date: 07/06/2004

 leggere e scrivere a tutti.
Ma il problema secondo me non è il file, il file al momento dell'esecuzione
dello script non esiste, qui si sta parlando di poter creare un file
all'interno molto probabilmente di una dir, anche se lui non lo specifica, e
quindi i permessi di scrittura deve averceli la dir.
Ora il problema che ho riscontrato io è che impostando i permessi della
cartella sia a 666 che a 766, dà errore, l'unico modo con cui poi dal client
riesco a far creare file allo script è impostando i permessi della cartella
a 777, sinceramente non so perchè e se tu potessi darmi/darci ulteriori
spiegazioni su questo, penso te ne saremmo entrambi riconoscenti.
stefano

 spiegazioni su questo, penso te ne saremmo entrambi riconoscenti.
Ah ecco, ora e' piu' chiaro. E' ovvio che non basta dare i permessi al file,
ma devi darli anche alla dir che lo contiene.
Solo che per la dir il discorso e' un pochino diverso. In effetti per la dir
l'attributo x (eXecute) che dai impostando a 7 il valore byte del chmod
serve non per eseguire, una dir non puo' mai essere eseguita, ma per
entrarci!
Mi spiego meglio l'attributo eXecute ti permette di "entrare" nella
directory, poi devi avere l'attributo Write per poterci scrivere dentro. Se
hai solo Write in teoria potresti scrivere nella dir, il problema e' che
nelal dir non ci puoi "entrare" ecco perche' per quanto riguarda le
directory l'attributo eXecute deve esserci insieme a Write, ok?
Quindi discorso diverso che per il file, ma il concetto e' lo stesso, cerca
di dare i permessi solo al propietario del file e non a chiunque.


 di dare i permessi solo al propietario del file e non a chiunque.
grazie per l'approfondimento, a questo punto però mi chiedo chi sia il
proprietario del file, cioè, se il file viene creato dal client attraverso
l'applicazione in php, è giusto dire che è il client il proprietario del
file? e quindi tutti coloro che hanno accesso a quello script dal browser e
che creano/scrivono sul file? Ma a questo punto la dir potrei settarla anche
a 667? o 557? Scusami per l'assurdo, ma sto approfittandone per schiarirmi
definitivamente le idee.
Cmq ora faccio delle prove..
Grazie
stefano
p.s.: ormai sembra che il thread sia diventato il mio. ;o)

 Cmq ora faccio delle prove..
Ok, non c'e' problema.
Allora l'utente che e' propietario del file in questo caso deve coincidere
con l'utente con il quale gira il webserver.
Per esempio sul mio sistema linux Apache gira con utente chiamato www-data:
debian:/var/log# ps -fe |grep apache
www-data   316 26492  0 06:27 ?        00:00:00 /usr/sbin/apache
Qundi se il mio script genera un file lo genera con utente www-data.
es.
Eseguo questo script sul mio webserver
<?php
$fd = fopen("pippo.txt", "w");
fwrite($fd, "prova");
fclose($fd);
?>
ok, guarda qui il file che ha generato:
debian:/var/www/html/provephp# ls -la pippo.txt
-rw-r--r--    1 www-data www-data        5 Jun 11 16:27 pippo.txt
Chiaro? Quello che hai detto tu "è giusto dire che è il client il
proprietario del file?" non ha senso perche' un client non e' un utente, e
comunque quando il tuo browser lavora manda le richieste al webserver, ed e'
lui che "agisce" e scrive i file, quindi www-data nel mio caso.
Tutto chiaro? Quindi e' solo l'utente www-data che deve avere rw sul file,
gli altri non e' il caso che ci debbano poter scrivere, quindi basta un
solo "r" o magari nulla che e' meglio.
Tutto chiaro?


 Tutto chiaro?
ah ok, tutto chiaro, ti ringrazio ;o)
ste