« 1 2
Autor Zpráva
imploder
Profil
Na ic.cz je to nějaké divné. Kvůli safe_mode nemůže skript prakticky nijak přistupovat k souborům. Potřebuje na to práva 0777. Nebude pak každý na serveru mít přístup k takovému adresáři? Jinak safe_mode nic nedovolí. Safe_mode taky nedovoluje funkci chmod, takže skript práva nastavit nemůže.

Na wz.cz například je safe_mode taky, ale všechno tam funguje. Safe_mode nebrání skriptu přistupovat k souboru nebo adresáři s jiným UID vlastníka jako to dělá na ic.cz. Skript může procházet adresář, otevírat soubory, a nepotřebuje přitom chmod 0777.

(na wz.cz)
-----kód zpouštěný ze shell.php ---------
$dir = opendir(".");
while($file = readdir($dir)) 
echo $file."<br>";
closedir($dir);
echo fileperms("shell.php")."<br>";
echo fileperms("."); 
------- jeho výstup --------
.
..
.htaccess
adresar
shell.php
33204
16893


Takže shell.php vlastní UID 33, zatímco adresář, ve kterém se nachází, vlastní UID 16 (je to tak?). Obojí (adresář i skript) jsem přitom nahrál přes FTP (vytvořil adresář a do něj FTP klientem nahrál skript). Je divné, že:
- obojí je vytvořené přes stejný FTP účet a má přitom jiného majitele
- narozdíl od ic.cz tady různí vlastníci nevadí

Přitom safe_mode povoluje přístup jenom k souborům a adresářům, kde vlastník souboru odpovídá uživateli, kterému patří skript. Dá se pomocí safe_mode_gid nastavit, aby kontroloval jenom skupinu, ale to je na wz.cz vypnuté. Tak nevím, jaktože to na wz.cz tak funguje. Nedává to smysl - proč na wz.cz safe_mode nedělá tyhle problémy? Když jsem to zkusil hledat, tak jsem našel safe_mode on jako nepřekonatelný problém při HTTP uploadu - server (Apache) zapíše ten soubor do tmp pod uživatelem, pod kterým běží, a skripty jsou přitom nahrané přes FTP, tj. zase pod jiným uživatelem (každému pod jeho, aby si různí uživatelé na serveru nemohli vzájemně lézt do souborů). Výsledkem je, že skript s uploadovaným souborem nemůže manipulovat, protože vlastník skriptu není vlastníkem uploadovaného souboru (tj. uživatel, pod kterým běží Apache).

Jak jde tohle dohromady s nastavením práv (přes FTP) na 777? Řeší to tu situaci vůbec? Našel jsem, že se tehnle problém se safe_modem řeší krkolomně nahrazením uploadu FTP uploadem. Předpokládám, že je to jenom náhradní řešení pro špatně nastavené servery (jako ic.cz?).

Takže dilema:
safe_mode off = každý může všechno, uživatelé si můžou na hostingu navzájem číst a přepisovat weby (to je samozřejmě zvlášť u veřejného hostingu silně nežádoucí)
safe_mode on = každý má svůj píseček (tak je to správně), ale nefunguje normálně upload, co je nahrané přes FTP nemá přístup k věcem uploadovaným HTTP uploadem Apache atp.
- je skutečně neřešitelné?

Prý v PHP6 už nemá být vůbec safe_mode a místo toho se bude nastavovat jen open_basedir a tím se skripty každého uživatele omezí na jemu přidělený adresář a tak nebudou moct lézt do adresářů jiných uživatelů. Pokud je to takhle jednoduché, tak proč se to už teď nepoužívá místo toho očividně silně problematického (i když na wz.cz asi ze záhadného důvodu ne) safe_modu?

EDIT: prosím kdyžtak mmmoderátory, aby to podle potřeby vytrhli, asi jsem se moc rozepsal ve špatném tématu
honza95
Profil
Ještě mám jeden problémeček. Nevíte někdo jak zapsat promněnou do sql databáze? Potřebuji v databázi vytvořit tabulku, a to tak, že na každé stránce bude promněná ˘$nazev = "nazev_clanku" a taky tam bude odkaz na script, který vytvoří tabulku nazev_clanku. Nevíte
tiso
Profil
honza95 - vieme, ale takéto riešenie nie je správne. Správne riešenie je mať len jednu tabuľku s komentármi, ktorá bude obsahovať stĺpec s ID článku.
honza95
Profil
Dobrá, to by se dalo použít. Ale co když budu potřebovat zapsat něco z komentáře do tabulky? co pak?

Mohl bych to zapsat takto ?
  <form method="POST" action="">
   Jméno<br>
  <input type="text" name="name"><br>
   E-mail<br>
  <input type="text" name="mail"><br>
   Předmět<br>
  <input type="text" name="predmet"><br><br>
  Zpráva (max. 420 znaků)<br><br>
  <textarea name="text" rows="15" cols="45"></textarea><br><br>
  <input type="submit" value="Napiš komentář">
  <?php
  $spojeni = MySQL_Connect("mysql.ic.cz","eb_honzuv","xxxxxxx");
  if(!$spojeni):
   echo "ERROR: nelze navázat spojení s databázovým serverm !!!";
   endif;
   if($spojeni):
   echo "Mysql připojeno";
    endif;

$sql = "INSERT INTO komentare VALUES (
".$name.",
now(),
".$mail.",
".$predmet.",
".$text.");";
MySQL_DB_Query("eb_honzuv", $sql, $spojeni);

$chyba = MySQL_Error();
echo $chyba; 
  ?>
honza95
Profil
Jak to tedy udělat, abych mohl používat jen jednu databázi, ale aby se pro každý článek zobrazovaly ty komentáře, které byly napsány zrovna u toho článku?
tiso
Profil
honza95 [#5]
abych mohl používat jen jednu databázi“ - myslíš tabuľku
aby se pro každý článek zobrazovaly ty komentáře, které byly napsány zrovna u toho článku
SELECT FROM komentare WHERE clanek_id=...
« 1 2

Vaše odpověď

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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