Autor Zpráva
suvel
Profil
Několik hodin jsem prohledával internet a nenašel jsem to:
Není problém "uploadnout" soubor pomocí move_uploaded_file, pokud mám práva ke složce nastavená na w pro kohokoli. Ale pak se dřív nebo později dočkám toho, že mi tam nedejbože někdo nahraje svůj php script a spustí ho. Jak z php "uploadnu" soubor pod heslem a uživatelským jménem (např spojení z php k databázi je taky pod heslem a uživatelským jménem)?. Kdejaký ftp manager to umí. Anebo pro to existuje jiná bezpečná metoda?
mckay
Profil
suvel:
V jednom php skriptu ověříš, jestli uživatel, který se přihlásil je v databázi, nebo ne. Když ano, ověříš, jestli se hesla shodují, pokud ano, ukážeš mu webovou stránku, přes kterou bude nahrávat (ta stránka samotná bude kontrolovat stále, jestli má uživatel právo), a nahraje to. Takhle si to myslel?
Leo
Profil
Bezpečná metoda je ta, že

1, nebudete věřit ničemu co tvrdí prohlížeč (typ souboru, velikost, atd.)
2, povolíte jen určité přípony souboru, a jen s těmi soubor ukládáte
3, nebudete je - pokud nemusíte - ukládat do adresáře dostupného z prohlížeče

Podotýkám, že samotná kontrola skutečného typu obrázku (např. přes getimagesize nic neřeší). Leo
suvel
Profil
Jestliže chci uložit soubor na server někde na hostingu, použiju k tomu nejlépe ftp manager, kde musím zadat své přístupové údaje, jméno a heslo. Jinak tam neuložím nic. Rád bych věděl, jak to ten ftp dělá a podobně potřebuju napsat script. Snad jsem to napsal srozumitelně :-)
Leo
Profil
Tak chcete to přenášet http (upload) nebo ftp? A řešíte přenos souboru nebo přihlašování uživatele? Leo
suvel
Profil
Mám někde na hostingu svoje složky a samozřejmě přístupové jméno a heslo. Chci z php do jedné ze složek "uploudovat" soubory a samozřejmě nechci nastavit práva ke té složce tak, aby byla složka veřejně přístupná, to by pak nebyl problém, to pak samozřejmě jde pomocí move_uploaded_file. Takže z php musí ten soubor odejít do složky spolu s přístupovými právy (login + heslo). Tak, jak to dělají ftp managery. Je mi jedno jak, ale nějak to jde a já nevím jak.
Mimochodem, když přistupuji k databázi, nejprve musím taky vytvořit spojení s login a heslem a až pak můžu tu databázi plnit.
Leo
Profil
"Mám někde na hostingu svoje složky a samozřejmě přístupové jméno a heslo."

Přístupové jméno a heslo se váže vždycky na konkrétní způsob přístupu - co máte na mysli v tomto případě? Leo
suvel
Profil
V tomhle případě ftp
suvel
Profil
Tak jsem věnoval opravdu hodně času problematice uploadu a downloadu ftp, bohužel s téměř nulovým výsledkem:
Není problém navázat spojení se serverem pomocí ftp_connect("www.něco.cz") a ftp_login($conn_id,"login","password"). Tím ovšem to jednoduché končí. ftp_put funguje jen, má-li se soubor nahrát do složky, která má "všechna práva" (0777), jinam ne (tak proč mám navázáno spojení s login a password? To jsem se mohl připojit jako anonym a výsledek by byl stejný!! Navíc bych nemusel použí ftp, ale stačila by bez problému docela obyčejná fce FOpen nebo move_uploaded_file). Dále doteď ještě asi nikdo nepřišel na univerzální metodu, jak zadávat cestu (obligátní hláška No such file or directory, i když existuje), měnit práva nelze - chmod funguje jen na některých serverech respetive složkách, ftp_chmod umí php až od nevímužkolikáté verze, když na serveru je jako k vzteku verze nižší atd. atd.
Existují stovky fór a stránek, které se snaží věnovat problematice ftp, ale nenarazil jsem ani na jeden případ, kdy by to někomu v praxi opravdu a univerzálně fungovalo. A přeci je řešení - umí to kdejaký ftp manager! A zadáte-li v něm přístupové údaje, neptá se na nic a vždycky nejen bez problému naváže spojení s jakýmkoli serverem, ale dovolí upload i download, tvoření a mazání složek a souborů a některé i nastavení přístupových práv. To se ještě nenašel nikdo, kdo by byl tu problematiku ochotný osvětlit? Nebo sem proboha někdo dejte aspoň odkaz někam, kde je to vyřešeno (já, potažmo Google, nic takového nenašel). Myslím (alespoň podle množství fór, které jsem prostudoval) že by to pomohlo hromadě lidem.
Já budu ještě trochu experimentovat a kdybych byl čirou náhodou úspěšný, pověsím to sem. Hezké svátky!
suvel
Profil
Konečně úspěch, zatím upload! Tedy pro všechny, kteří si chtějí ušetřit trápení, které jsem prožil já:
1) ftp upload souboru na server pomocí <input type="file">
Zjednodušeně to funguje takto:
<?php
if ($_POST['odeslano']){
$conn_id = ftp_connect("www.jméno serveru.cz");
$login_result = ftp_login($conn_id,"login","pw");
@$ret = ftp_put($conn_id, "./www/test/"a_je_tam.jpg", $_FILES["Foto"]["tmp_name"], FTP_BINARY);
/* Tohle je asi nejdůležitější: Cestu k souboru, kam ho chceme nahrát, je nutné zadávat od
    vaší kořenové složky, a to s tečkou na začátku!! Vaše kořenová složka je ta, která se vám ukáže
    např. po připojení ftp manageru. Jakékoli jiné zadání cesty selže.*/
ftp_close($conn_id);
}?>
<form method="POST" ENCTYPE="multipart/form-data">
<input type="file" name="Foto" ACCEPT="image/*">
<!-- ACCEPT = typ souboru. Pro text = "text/*" -->
<input type="hidden" name="odeslano" value="1">
<input type="submit" value="Odeslat">
</form>

Teď máme úspěšně ve složce test náš obrázek s novým názvem a_je_tam.jpg (nebudu tady popisovat různé kontroly velikosti, přípony atd, to je k dohledání na mnoha jiných místech). A ještě poznámka - není třeba vůbec použít fci CHMOD, protože po úspěšném spojení se serverem jsou akceptována vaše práva dle user a pw - nemáte-li přidělena administrátorská, stejně byste si CHMODem moc nepomohli...

Trochu jiné je řešení situace, kdy potřebujete na serveru vytvořit například textový soubor (bezpečně uložit text ze svého formuláře):
2) Vytvoření textového souboru na serveru
<?php
$conn_id = ftp_connect("www.jméno serveru.cz");
$login_result = ftp_login($conn_id,"login","pw");
// První fáze:
$text = "Nějaký náš text"; // v praxi proměnná, naplněná z inputu nebo taxtarea
$fp = FOpen ('./moje_temp/tmp.txt', "w"); // Zde je nutné zadávat naopak relativní adresu! 
FPutS ($fp, $text);
FClose ($fp);				
//Druhá fáze:
$fp = fopen('./moje_temp/tmp.txt', 'r');
$ret = ftp_fput($conn_id, "./www/upload/test/test.txt", $fp, FTP_ASCII);
FClose ($fp);
ftp_delete($conn_id, './www/upload/moje_temp/tmp.txt'); //Pro klid duše :-)
ftp_close($conn_id);
?>

Poznámka: php script je v tomto případě umístěn ve složce ./www/upload.
Zde je potřeba nejprve nejlépe pomocí nějakého ftp manageru na serveru vytvořit složku s názvem třeba moje_temp s takovými právy, aby k ní měl přístup kdokoli (user rwx). Nedoporučuji se spoléhat na systémovou složku temp, protože se do ní na některých serverech nedostanete ani s administrátorskými právy.
Vlastní uložení probíhá ve dvou fázích: V první fázi se na serveru vytvoří soubor tmp.txt, který je s právem w pro každého usera - to by nám tedy nebylo moc platné, protože v tuhle chvíli k němu má přístup kdokoli a kdokoli si s ním může dělat co chce. Proto ho ve druhé fázi pomocí fce ftp_fput (pozor - ne ftp_put!) přeneseme do cílové složky test, kde se uloží pod námi zvoleným názvem (zde test.txt) už s právem jen r. Poznámka - nemá smysl používat move_uploaded_file, jak se lze dočíst v některých diskuzích - to by nám soubor zůstal s w přístupný pro každého. A ani zde není třeba fce CHMOD - snad jen v tom případě, kdybychom chtěli složku moje_temp tvořit přímo ze scriptu.

Tohle skutečně univerzálně funguje - zkoušel jsem na několika serverech s různými verzemi php.
Kdyby měl někdo nějaké otázky, napište je sem, rád odpovím.
Leo
Profil
K čemu je to dobré? Leo
suvel
Profil
Nerozumím. Snad k tomu, aby ti, kdo z php potřebují ftp upload, nemuseli tápat (?).
Leo
Profil
Nějak mi to nemyslí, ale k čemu je dobrý ftp upload, resp. jaké jsou výhody oproti klasickému uploadu přes formulář bez využití ftp fcí? Leo
suvel
Profil
Jde o práva - přes ftp přistupuješ na server, kde máš svoje složky, s přidělenými právy (proto login a password) - obvykle jako Administrátor. Např. v rámci hostingu si nikdo bez práv ani neškrtne. Klasický upload funguje jen na soubory a složky, které mají nastavena User práva na rwx.
Ještě jinak: každá složka i soubor mají tři skupiny práv: Administrátorská, Skupiny a pro Usery (např rwx, r-x, r-x). Nepřihlásím-li se přes ftp jako Administrátor, mám smolíka.
nightfish
Profil
Leo:
Nějak mi to nemyslí, ale k čemu je dobrý ftp upload, resp. jaké jsou výhody oproti klasickému uploadu přes formulář bez využití ftp fcí?
ftp upload ukládá soubory s vlastníkem podle uživatele, který se přihlásí (k ftp serveru), což může být v některých případech výhodné
Leo
Profil
Aha, už chápu o co vám šlo, mátlo mě, že se v tom php skriptu natrdo používá stejný ftp login a heslo, takže každý, kdo skript spustí má patřičná oprávnění, a téma je nadepsané "Zabezpečený" upload na server. Leo
weber
Profil *
Pouzi .htacess a .htpassword ne ??
suvel
Profil
weber:
Sorry, ale tahle diskuze je o něčem jiném...
aaadam
Profil *
Díky suvel, tvůj skript mi dost pomohl ;-)
aaadam
suvel
Profil
Ještě doplňuji jeden důležitý poznatek z praxe: Po zavolání fce ftp_fput se někdy stane, že vytvoří prázdný soubor (0 byte), namísto toho, co by měla. Tento problém se odstraní, když před ftp_fput zavoláme @ftp_pasv($conn_id, true);

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: