ugrás a tartalomhoz

Képek korlátozása felhasználók szerint

stan · 2009. Aug. 22. (Szo), 11.56
Php - Mysql alapú saját fejlesztésű oldalamon azt szeretném elérni, hogy ha egy felhasználóm bejelentkezés után feltölt egy képet a szerverre, akkor azt a saját fiókjában bármikor megtekinthesse, de más felhasználó ne láthassa, még akkor se ha ugyan azt az url-t beírja a böngészőbe.

Nem tudom hogyan lehet a fájlokat ilyen módon korlátozni, valami ötlet?
 
1

Jogosultság

s_volenszki · 2009. Aug. 22. (Szo), 13.02
Egy lehetséges megoldás:

Akár adatbázisban, akár fájlrendszerben tárolod a felhasználók képeit, csinálj egy táblát, ahol minden egyes képfájl nevét és a felhasználó azonosítóját letárolod.

Bejelentkezés után vélhetően egy SESSION változóba bekerül a felhasználó azonosítója, így a kép megjelenítésére irányuló kéréskor vizsgálhatod, hogy csak azokat a képeket kérdezze le, amelyek felhasználó azonosítója megegyezik a SESSION-ban tárolt felhasználó azonosítóval.

Ha mondjuk egyel előrébb mész és feltételezed, hogy a felhasználók megoszthatnak egymásközt képeket, sőt, bizonyos képeket megmutatnak nem bejelentkezett felhasználóknak is, akkor célszerű csinálni még egy mezőt amibe beírod a kép megjelenítéséhez kapcsolódó jogosultságot (pl.:0=private, 1=corporate,2=public).

Ezek után vizsgálhatod, hogy egy kép kinek a tulajdona, meg azt is, hogy kik láthatják.
2

Nem egészen világos

stan · 2009. Aug. 22. (Szo), 13.49
Hogy érted azt hogy "Akár adatbázisban, akár fájlrendszerben tárolod a felhasználók képeit", nem értem mit értesz az alatt, hogy adatbázisban tárolom a képeket?

Egyébként alapjában véve nem értem azt, hogy ha pl. van nekem egy képem mondjuk az ftp gyökér könyvtárban, akkor ugye elvileg olyan helyre kell tennem, amit böngészőből is el lehet érni, így mi akadályoz meg akárkit hogy a kép fájl elérési útját beírja a böngészőbe. Én ezt nem értem, magát a fent leírt azonosítási folyamatot session alapján azt értem.

Valaki világosítson fel, mert én itt valamit akkor vagy nagyon nem értek, vagy félreértek.
3

Indítsunk egy kicsit messzebbről...

s_volenszki · 2009. Aug. 22. (Szo), 14.23
Ismered pl. MVC-t? Ennek a tervezési mintának van egy óriási előnye. Minden egyes http kérés ugyan azon az egy fájlon megy keresztül, ezt hívják front controller-nek. Természetesen ezzel egy időben van az alkalmazás gyökér könyvtárában egy olyan .htaccess fájl, ami minden kérést erre a bizonyos front controller-re irányít.

Innentől kezdve egyenes az út az előző hozászolásomban leírtakhoz, ugyan is még ha tudnád is a fájl pontos helyét, ha az beljebb van mint a webroot (feljebb meg ugye nem lehet), akkor az a kérés a fornt controller-en landol. Itt már mehet az azonosítgatás és a jogok vizsgálata.

Nézd meg a flickr-t (http://www.flickr.com/photos/s_volenszki/3793105672/)! Ott sincsenek .jpg-ek az url-ben.

Megjegyzés 1:

Bár nem volt szó róla, gondolom a képeket a felhasználók űrlapon töltik fel nem ftp protokolon?!

Megjegyzés 2:

http://www.phpriot.com/articles/images-in-mysql
4

Már értem

stan · 2009. Aug. 22. (Szo), 20.08
Igen, az oldalamat igyekeztem az MVC szerint írni, de igazából még nagyon sok dolgot csak most tanulok erről. A felhasználók természetesen űrlapon töltik fel a képeket, és az én oldalamon is minen a front controlleren keresztül működik. De akkor maga a htaccess nincs beállítva rendesen, mert pl képeket el lehet érni url alapján.

Már csak akkor azt kellene tudnom, hogy egy ilyen htaccess fájl hogy néz ki, és minek kell pontosan működnie ilyenkor. Illetve ha apache beállítás miatt nem működik, akkor a rendszergazda felé milyen kéréssel kell forduljak ez ügyben.
5

mod rewrite

Ustak · 2009. Aug. 22. (Szo), 21.38
Ez a hozzászólásom hátha segít:

rewrite modul bekapcsolása valamint a weblaboron jó cikkek és hozzászólások vannak a témáról.
Üdv:
Gábor.
6

Például így:

s_volenszki · 2009. Aug. 23. (V), 00.27
Egy minta:

<IfModule mod_rewrite.c>  
    RewriteEngine on
    RewriteBase /
    RewriteCond %{REQUEST_URI} !(^index.php$)
    RewriteCond %{REQUEST_URI} !(\.(js|css|ico|gif|png)$)
    RewriteRule (.*) index.php
</IfModule>


A többi kérdésedre Gábor már mutatott jó írányt!
7

Publikus fájlok

Poetro · 2009. Aug. 23. (V), 11.40
képeket el lehet érni url alapján

Akkor semmiképp se rakd olyan helyre ahonnan el lehet érni URL alapján. Azaz rakd a Document Root-on kívülre, és csak PHP segítségével lehessen hozzáférni, így tudod ellenőrízni, hogy az illetőnek van-e hozzáférése.
Pl: http://example.com/index.php?showImage/kepem.jpg
És a pszeudokód valami ilyesmi:

if ($user->hasFileAccess($image)) {
  header("Content-Type: ". $image->mime);
  header("Content-Transfer-Encoding: binary");
  header("Content-Length: ". $image->size);

  fpassthru(variable_get("upload_dir", '/upload') .'/'. $image->path);
}
8

Azt hiszem megvan

stan · 2009. Aug. 23. (V), 19.19
Azt hiszem a legjobb az lesz, ha adatbázisban tárolom el a képeket, mert így sokkal mobilisabb lesz az oldalam tartalma, és könnyeben tudom kezelni a jogosultságokat. Ti mit gondoltok erről, szerintetek jó ötlet?
9

Én nem tenném adatbázisba

zila · 2009. Aug. 24. (H), 15.32
Rakhatod adatbázisba, persze, ha az neked szimpatikus, lehetnek vele performancia gondok, meg a méret is elszaladhat, menteni is körülményesebb az adatbázist, hordozni meg még körülményesebb.
A jogosultság kezelés ettől nem lesz könnyebb, szerintem legalábbis. Jobban járnál, ha megértenéd a webszerver működését, tisztába jönnél, hogy mi a Document root, mit ér el a php a szerveren, mit érhetnek el a látógatók az url-en keresztül stb.

Ha a képeid adatbázisban vannak, akkor írnod kell egy kis scriptet ami ezt a képet kiszolgálja a kliensnek (ellenőrzi a jogosultságot, kiszedi a db-ből a képet és leküldi a böngészőnek), ugyanilyen scriptet kell írnod akkor is, ha képek nincsenek adatbázisban (ekkor a jogosultág ellenőrzés után kiszeded a kép meta adatait a db-ből pl. az elérési útvonalat és a fájlnevet aztán ez alapján fájlrendszerből kiszolgálod a képet), hanem fájlrendszerben vannak de a docrooton kívül. Adatbázisba én csak a képek leíróit tenném (ki a tulajdonosa, mi a neve, típusa, mikor töltötték fel, mi a mérete, esetleg a szélesség és magassága, file neve, elérési útja a fájlrendszerben, stb.), a hozzá tartozó jogosultságokat meg úgy tárolod megintcsak ahogy akarod illetve ahogy a jogosultsági rendszeredet kitalálod.