| Subiectul anterior :: Subiectul următor |
| Autor |
Mesaj |
robertd
Data înscrierii: 09/Ian/2006
Mesaje: 61
Locație: Mures
|
| Trimis: Mie Ian 11, 2006 4:14 pm Titlul subiectului: Secure PDF !!!! |
|
|
Buna, as avea o intrebare :oops:
Pe scurt am niste fisiere pdf stocate intr-un dir www.site.ul.meu/date din site-ul meu. Si, am un script care alege anumite fisiere pdf in functie de utilizator apoi le creeaza un link catre ele www.site.ul.meu/date/user1.pdf.
Intrebare cum as putea securiza ca un user sa nu poate apela respectiv vedea doar fisierele la care dreptul? :roll:
Adica daca e logat ca si user1 sa nu poata accesa www.site.ul.meu/date/user2.pdf. Controlul userilor este facut prin mecanismul de Session. |
|
| Sus |
|
Pirahna
Data înscrierii: 22/Aug/2004
Mesaje: 4530
Locație: la birou
|
| Trimis: Mie Ian 11, 2006 5:17 pm Titlul subiectului: |
|
|
$userid=$_SESSION['userid'];
if($userid!=$required_userid) echo "nu domne !";
else echo "pdf-ul tau";
waaaw :P
avansat :) |
|
| Sus |
|
kul
Data înscrierii: 09/Dec/2005
Mesaje: 314
Locație: cta
|
| Trimis: Mie Ian 11, 2006 5:17 pm Titlul subiectului: |
|
|
www.site.ul.meu/date/user1-dsf334dsfasdaf.pdf
unde 'dsf334dsfasdaf' este o semnatura unica dupa un random md5 de aiurea inserata pe un camp separat la inregistrare in tabela de useri.
nu-i super-proof, dar poate iti ajunge. |
|
| Sus |
|
robertd
Data înscrierii: 09/Ian/2006
Mesaje: 61
Locație: Mures
|
| Trimis: Mie Ian 11, 2006 5:46 pm Titlul subiectului: |
|
|
Pirahna
Scriptul meu e conceput aprox in acceasi maniera in care ai prezentat-o tu :lol:
Problema e alta daca un utilizator obisnuit care vede calea exacta a fisierului sa nu poata accesa alt fisier pdf. Acesta nu trebuie sa fie neaparat logat ca sa il vada el pur si simplu isi scoate pdf-ul lui, vede calea apoi scrie www.site.ul.meu/date/un_alt_fisier.pdf si ar putea obtine date la care el nu este autorizat. Ce as dori eu e urmatorul lucru: userul sa isi poate lua fisierul lui fara sa stie de unde caci daca stie exact de unde poate accesa si alt fisier pdf. :? |
|
| Sus |
|
johnutz
Data înscrierii: 20/Iul/2004
Mesaje: 956
Locație: Între scaun și tastatură
|
| Trimis: Mie Ian 11, 2006 6:41 pm Titlul subiectului: |
|
|
Pe baza ideii lui Piry si paginii de la header() din manual: Cod: $userid=$_SESSION['userid'];
if($userid!=$required_userid) {
header('HTTP/1.1 403 Forbidden');
echo 'nu e voie, bah';
exit();
} else {
// We'll be outputting a PDF
header('Content-type: application/pdf');
// It will be called downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"');
// The PDF source is in original.pdf
readfile('/cale/eventual/absoluta/catre/original.pdf');
}
Iar original.php sa se afle intr-un director din afara site-ului sau daca nu se poate, intr-un dir protejat cu .htaccess
Desigur, in ceea ce priveste $_SESSION['userid'] vezi tu cum te descurci.. |
|
| Sus |
|
kul
Data înscrierii: 09/Dec/2005
Mesaje: 314
Locație: cta
|
| Trimis: Mie Ian 11, 2006 7:37 pm Titlul subiectului: |
|
|
si daca fisierele au mai mult de 8 mega fiecare sau mai mult? (desi e foarte probabil sa nu aiba). si daca site-ul e un heavy-duty traffic si mai e si pus pe un shared server?
oricum metoda e foarte buna pt fisiere mici |
|
| Sus |
|
coditza
Data înscrierii: 23/Ian/2004
Mesaje: 298
Locație: cluj-napoca
|
| Trimis: Joi Ian 12, 2006 2:38 am Titlul subiectului: |
|
|
Dupa cate stiu, readfile nu citeste tot si face output dintr-o data, ci, pe masura ce citeste inca o bucata din fisier ii face output.
Daca ma insel, atunci ramane si varianta:
an style="color: #000000"><?php ...
$fp = fopen('filelalalalalala',"r");
while(!feof($fp)) {
echo fread($fp,1024);
}
fclose($fp); |
|
| Sus |
|
robertd
Data înscrierii: 09/Ian/2006
Mesaje: 61
Locație: Mures
|
| Trimis: Joi Ian 12, 2006 12:27 pm Titlul subiectului: |
|
|
Buna,
Multumesc pt. sfaturi in special johnutz
Sa va prezint si rezolvarea problemei mele :P :idea: :
am facut 2 scripturi ce ruleaza astfel:
view.php
Cod:
<?php header("Expires: Thu, 17 May 2001 10:17:17 GMT"); // Date in the past
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // always modified
header ("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header ("Pragma: no-cache"); // HTTP/1.0
session_start();
if (!isset($_SESSION['SESSION'])) {require("../include/session_init.php");}
if ($_SESSION['LOGGEDIN'] != true) {
header("Location: ../general/login_system.php");
exit;
}
.....
// downloadeaza fisierul xxx.pdf
<a href="download.php?filename=<? echo $files[$j];?>"><?php echo $luni[substr($files[$j],12,2)];?><?php echo " ".substr($files[$j],8,4);?></a>
....
iar fisierul download.php
Cod:
<php
$filename=$_REQUEST['filename'];
if (!isset($filename)) exit;
$filename="./date/".$filename;
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename='.$filename.'');
readfile($filename);
exit;
?>
iar ambele fisiere se afla cu un dir mai sus decat dir-ul in care se afla fisierele pdf...deci teoreticaly speaking el nu vede de unde le ia pt. ca eu pot sa le pun oriunde fisierele pdf...
Daca aveti o rezolvare, mai buna, mai profi, mai corecta...va rog sa mi-o prezentati. :roll: |
|
| Sus |
|
johnutz
Data înscrierii: 20/Iul/2004
Mesaje: 956
Locație: Între scaun și tastatură
|
| Trimis: Joi Ian 12, 2006 8:07 pm Titlul subiectului: |
|
|
Ar fi totusi o problema.
Daca, de exemplu, se acceseaza download.php?filename=..%2Fdownload.php, $filename va avea valoarea ./date/../download.php, deci va fi trimis fisierul download.php.
A cateva variante:
- te asiguri ca $filename sa nu contina altceva decat caractere alfanumerice, punct si liniutza
- fiecarui fisier ii asociezi un ID, si apelezi download.php?ID=x; si verifici daca x e valid
- te asiguri ca va fi citit fisierul din directorul care vrei tu, cu realpath() si pathinfo()
Ah, si era sa uit. Trebuie sa pornesti si in download.php sesiunea si sa verifici daca e autentificat. |
|
| Sus |
|
robertd
Data înscrierii: 09/Ian/2006
Mesaje: 61
Locație: Mures
|
| Trimis: Vin Ian 13, 2006 4:04 pm Titlul subiectului: |
|
|
Citat:
Daca, de exemplu, se acceseaza download.php?filename=..%2Fdownload.php , $filename va avea valoarea ./date/../download.php , deci va fi trimis fisierul download.php.
Aici ai dreptate o sa restrictionez ca sa nu poate accesa fisiere php doar pdf.
Citat:
Ah, si era sa uit. Trebuie sa pornesti si in download.php sesiunea si sa verifici daca e autentificat.
Iar daca pun validarea si in dowload php imi da o eroare de genul headers cannot by modified, pt. ca am si acolo o instructiune header....
o sa mai testez :wink:
Ce ma gandesc eu sa fac in download.php e sa verific daca numele utilizatorului logat este acelasi cu o parte din numele fisierului pdf si doar atunci sa ii dea acces pe el. |
|
| Sus |
|
PHPRomania Bot
Bot Member
Data înscrierii: 27/Dec/2007
Mesaje: 1
Locaţie: Server Google |
| Trimis: Mie Dec 26, 2007 7:01 pm Titlul subiectului: Ad |
|
|
|
|
|
| Sus |
|
| |