ugrás a tartalomhoz

Realpath bugos

inf3rno · 2012. Szep. 7. (P), 01.11
Üdv.

PHP 5.2.17-ről van szó a mediacenter-nél.

Van egy olyan gondom, hogy feltöltök egy képet http-vel, és szeretném a temp könyvtár elérési útját lekérdezni, mert átméretezem a fájlt, és az átméretezett képeket is a tempbe tenném ideiglenesen. A feltöltött fájlok a /tmp-be mennek. Realpath-et használok útvonal normalizálásra, a gondom a következő:

realpath('/tmp') -> '/tmp'
realpath('/tmp/..') -> '/'
realpath('/tmp/tmp-uploaded-file') -> '/tmp/tmp-uploaded-file'
realpath('/tmp/tmp-uploaded-file/..') -> false 
Van bármi ötlet, hogy ez hogy fordulhat elő?

(Valszeg megkerülöm a .. helyett a fájlnév levágásával, de érdekelne, ha van erre magyarázat.)
 
1

A fájlnév levágásos

inf3rno · 2012. Szep. 7. (P), 01.26
A fájlnév levágásos workaround megoldotta. (Én már semmin sem lepődök meg, ha php-ról van szó...)
2

Ha a /tmp/tmp-uploaded-file

MadBence · 2012. Szep. 7. (P), 07.10
Ha a /tmp/tmp-uploaded-file nem mappa, akkor a /tmp/tmp-uploaded-file/.. el fog hasalni, mivel nincs tmp-uploaded-file nevű mappa, ahonnan visszaléphetnél a szülő könyvtárba.
A realpath() nem csak tisztán stringtranszformációt végez, hanem tényleges fájlrendszer IO műveleteket is végrehajt.
3

Lehet, hogy tényleg ez a

inf3rno · 2012. Szep. 7. (P), 14.30
Lehet, hogy tényleg ez a gond, nem tudom miért hittem azt, hogy fájlnév után jó a .. :-) Biztos, valami pillanatnyi elmezavar. Közben rájöttem, hogy a dirname teljesen jó ilyen célra...

Egyébként fura, mert localhoston pl ugyanaz a kód teljesen jól működik, pedig ott is fájlok után írom a ..-ot. Szóval ez egyáltalán nem ennyire egyértelmű. Akár még az is lehet, hogy operációs rendszer függő...

Egyébként jobban örülnék egy olyan megoldásnak, ami nem nézi meg, hogy létezik e az adott fájl/könyvtár, csak szimplán normalizálja az útvonalat, amit megadok neki. Tudsz ilyenről?
4

a realpath követi a

MadBence · 2012. Szep. 7. (P), 17.51
a realpath követi a symlinkeket és társait, ha tényleg csak normalizálni szereznéd az útvonalat, akkor a /../ és /./ kiszórása elegendő (nyilván figyelni kell, hogy az elején/végén is lehet, tehát nem simán 2 db replace, de kb ilyen bonyolultságú a dolog).
5

Azt vágom, de symlink követés

inf3rno · 2012. Szep. 7. (P), 17.59
Azt vágom, de symlink követés attól még nem lesz benne. Mondjuk ha van egy symlink-es útvonal meg egy sima, akkor a kettőről nem tudja megállapítani a rendszer, hogy az egy és ugyanaz...

Mondjuk ha le lehet rántani egy symlink listát, és azon keresni, akkor ez is megoldható. Egyelőre nem életbevágó, úgyhogy nem foglalkoztam még a témával. Csak az zavart, hogy nem tudom úgy normalizálni útvonalat, hogy ne létezne a fájl...
6

Ha nagyon akarod, bele lehet

MadBence · 2012. Szep. 7. (P), 22.43
Ha nagyon akarod, bele lehet erőltetni a symlink követést is a kódba, de én személy szerint nem tenném. Egy útvonal normalizálás ne végezzen már IO-t, legyen gyors. Feltétlenül szükség van symlinkekre?
7

Nincs, ezt ilyen extrának

inf3rno · 2012. Szep. 8. (Szo), 15.15
Nincs, ezt ilyen extrának gondoltam csak. Ezek szerint akkor elég a /. és a /.. feldolgozása?
8

Ha az adat a juzertől jön,

MadBence · 2012. Szep. 8. (Szo), 17.25
Ha az adat a juzertől jön, akkor érdemes lehet még az érvénytelen karakterek kiszórása is (egzotikus unicode karakterek, pl: mirror, stb), hátha valamivel próbálkozik.