Restricționarea accesului la fișiere într-un anumit folder

12 ian. 2011, 05:57:54
Vizualizări: 16.5K
Voturi: 2

Posibilă duplicare:
Cum să protejez fișierele încărcate, dacă utilizatorul nu este autentificat?

Există vreo metodă de a restricționa accesul direct la fișierele dintr-un anumit folder doar pentru anumiți utilizatori WordPress care au o anumită capabilitate setată?

2
Comentarii

Limitați accesul la anumite fișiere PHP dintr-un director? Sau la TOATE fișierele dintr-un director?

MathSmath MathSmath
12 ian. 2011 06:26:54

Limitarea accesului la toate fișierele dintr-un anumit director pentru accesul direct de la toți, EXCEPTÂND acei utilizatori care au acea capabilitate specifică.

NetConstructor.com NetConstructor.com
14 ian. 2011 09:24:48
Toate răspunsurile la întrebare 1
1

Cea mai ușoară soluție PHP ar fi să creezi un script de descărcare. Acesta verifică dacă utilizatorul are permisiunile necesare și servește fișierul către clientul web. Sau, preferința mea, configurează un folder în afara rădăcinii web și plasează fișierele acolo.

Setează permisiunile fișierelor fără acces anonim și lasă serverul web să le citească și să le trimită într-un fișier PHP ca cel de mai jos. Codul de mai jos citește fișierul și îl trimite către browser.

header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: private",false); 
header('Content-disposition: attachment; filename='. $file;
header("Content-Transfer-Encoding:  binary"); 
header("Content-Length: ". filesize(ABSPATH.$dir.$file); 
readfile($dir.$file);
exit();

editare 14-1:

creează o casetă normală de încărcare și când fișierul este încărcat, mută-l într-un folder în afara directorului rădăcină web (acest folder nu poate fi accesat de utilizatori prin http, doar de serverul web).

if (move_uploaded_file( $_FILES['Filedata']['tmp_name'] , $upload_dir.$filename ) ) {
// cod de executat după ce fișierul a fost copiat cu succes. Actualizează baza de date sau altceva.
}

$upload_dir.$filename este calea completă către directorul din afara folderului www. Fișierul poate fi acum accesat doar de serverul web. Salvează locația într-o bază de date cu informații despre încărcător. Sau creează subdirectoare pentru fiecare utilizator. Ai nevoie de ceva pentru a diferenția fișierele pentru fiecare utilizator.

Acum, când vrei să descarci un fișier, creează un script numit download.php În acel script verifici dacă utilizatorul are drepturi asupra fișierului.

global $user;
if ($user->id == $uploaded_user_id) {
    header("Expires: 0"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Cache-Control: private",false); 
    header('Content-disposition: attachment; filename='. $file;
    header("Content-Transfer-Encoding:  binary"); 
    header("Content-Length: ". filesize(ABSPATH.$upload_dir.$file); 
    readfile($upload_dir.$file);
    exit();

}

acum vrei să transmiți un file_id sau nume către scriptul de descărcare. deci construiește link-ul ca url/download.php?file=$file. Trebuie să apelezi acest lucru direct sau în primele etape ale plugin-ului tău, altfel vei primi mesajul "headers already sent". Scriptul va verifica dacă utilizatorul are drepturi și va începe să trimită date binare.

Ar trebui să fie ceva de genul acesta, sper că te ajută. Nu este complet, dar ar trebui să te pornească pe drum.

12 ian. 2011 10:45:31
Comentarii

mulțumesc foarte mult pentru răspuns. Aș aprecia foarte mult dacă ați putea extinde explicația. Ideea este că doresc să creez un metabox personalizat pentru încărcare care să transfere fișiere într-un director specific pe server. Apoi, aș dori să restricționez accesul direct la aceste fișiere pentru public, permițând accesul doar utilizatorilor autentificați care au o capabilitate specifică de vizualizare a tuturor acestor fișiere. Ce metodă credeți că ar fi cea mai bună pentru a implementa acest lucru?

NetConstructor.com NetConstructor.com
14 ian. 2011 09:26:39