Náhrada FTP - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



PHP

Náhrada FTP

redakcni system

31. března 2003, 00.00 | Možnosti PHP nám nabízejí odstranění závislosti na FTP protokolu. Jak to implementovat do naše RS si ukážeme v tomto díle.

Dnes tedy začínáme další část, se kterou bychom měli nahradit FTP rozhraní pro práci se soubory a která by nám pomohla řešit náhle vzniknuvší problémy, popřípadě upload nových souborů na server.

Hned pro začátek bych chtěl upozornit na jednu věc a to využitelnost tohoto způsobu práce se soubory. Většina (dá se říci že všechny) freeweby tuto možnost zakazují. Je to z důvodů bezpečí vašich i jejich souborů. Pokud by bylo tak jednoduché se k nim dostat, tak by kdokoliv mohl měnit obsah serveru, což je jistě nežádoucí. Způsobuje to nastavení práv, jaké dostanete jako uživatel. Správci serveru vám umožňují upload pomocí scriptů, které toto zabezpečení obcházejí. Jak? Podívejte se na zdrojový kod formuláře, kterým se to provádí. Již při pohledu na skrytá pole to bude jasné.

To je ale na jiné povídání. Co tedy bude tento systém umět. Zobrazí nám jméno souboru, jeho velikost, datum a čas vzniku. Dále budeme moci mazat, upravovat a přidávat soubory.

Aby jsme se scriptem soubory.php mohli pracovat, musíme se k němu nějak dostat. Přidáme tedy odkaz do souboru menu.php.

.
.
.
// volby pro administrátora
if ($INFO[6] == 3)
{
echo "<A HREF=\"../soubory.php\" target=main $click>Editace souborů</A><BR>";
echo "<A HREF=users.php target=main $click>Editace uživatelů</A><BR>\n";
.
.
.

Je jasné, že práci se zdojovým kodem souborů přenecháme pouze správci systému, kterým je v našem případě šéfredaktor.

Následuje script soubory.php s popisem. Upozorňuji, že tento script musí být umístěn v kořeni (./)!!!

<?
Header("Pragma: No-cache");
Header("Cache-Control: no-cache");
Header("Expires: ".GMDate("D, d M Y H:i:s")."GMT");

// pokud neproběhla autorizace, ukončíme skript
if (!isset($PHP_AUTH_USER))
{
   echo "Neautorizovaný přístup";
   exit;
}

@include "../function.php";
@include "../conn.php";

// autorizace
auth();

//mazání
if(isset($delete))
{
	$delete=base64_decode($delete);
	if(is_dir($delete))
		@rmdir($delete);
	else
		@unlink($delete);
}

// co budeme prohlížet
If($ad=="")
	$ad=DirName("$PATH_TRANSLATED");
else
	$ad=base64_decode($ad);

// to tu ještě nebylo, podmíněný operátor
$ad==DirName($PATH_TRANSLATED) ? $zobr=0 : $zobr=1;

//hlavička
$css="true";

head();

?>
<SCRIPT LANGUAGE="JavaScript">
<!--
function user(zdroj) { aPopUp =window.open(zdroj,'Detail',
 'toolbar=no,location=no,directories=no,status=no,scrollbars=yes,
  resizable=no,copyhistory=no, width=580,height=450');}
function user1(zdroj) { aPopUp =window.open(zdroj,'Detail',
 'toolbar=no,location=no,directories=no,status=no,scrollbars=yes,
  resizable=no,copyhistory=no, width=380,height=150');}
// -->
</SCRIPT>
<H3 ALIGN="CENTER"><?=$ad?></H3>
<A HREF="javascript:user1('./admin/adresar.php?ad=<?=base64_encode($ad)?>')">
 vytvořit adresář</A><BR>
<A HREF="javascript:user1('./admin/upload.php?ad=<?=base64_encode($ad)?>')">
 přidat soubor</A><P>
<TABLE WIDTH="100%" ALIGN="CENTER" RULES="rows" FRAME="box" CELLSPACING=0>
<TR BGCOLOR="#C8C88A"><TD>Název</TD><TD>Velikost</TD><TD>Vytvořen</TD>
 <TD>Smazat/Stáhnout</TD></TR>
<?
clearstatcache();
ChDir($ad);
$b=Dir($ad);
while($c=$b->Read())
   if(FileType("$c")=="dir"):	
     if($c==".." and $zobr):
       $d=DirName("$b->path");
       echo "<TR BGCOLOR=\"#00cc00\" ALIGN=\"Center\"><TD COLSPAN=4><FORM 
        METHOD=\"GET\" ACTION=\"soubory.php\"><INPUT TYPE=\"HIDDEN\" 
        NAME=\"ad\" VALUE=\"".base64_encode($d)."\"><INPUT TYPE=\"SUBMIT\" 
        VALUE=\"O úroveň výš\"></FORM>";	
     elseif($c!=".." and $c!="."):
        $d="$b->path/$c";
        echo "<TR><TD BGCOLOR=\"#C0C0C0\"><FORM ACTION=\"soubory.php\"
          METHOD=\"GET\"><INPUT TYPE=\"HIDDEN\" NAME=\"ad\" 
          VALUE=\"".base64_encode($d)."\"><INPUT TYPE=\"SUBMIT\" VALUE=\"$c\">
          </FORM>
          <TD BGCOLOR=\"#C0E4C0\" ALIGN=\"Right\"><FONT COLOR=\"#008700\">
            adresář</FONT>
          <TD BGCOLOR=\"#FFC0C0\" ALIGN=\"Right\"><FONT COLOR=\#00A7FF\">"
            .StrFTime("%H:%M %d.%m %Y", FileCTime($c))."</FONT>
          <TD BGCOLOR=\"#C0C0C0\">
          <A HREF=\"soubory.php?delete=".base64_encode($b->path."/".$c)."\" 
          onclick=\"return confirm('Opravdu chceš adresář smazat ?')\">
          smazat</A>\n";
          endif;
       else:
         echo "<TR><TD BGCOLOR=\"#C0C0C0\">
           <A HREF=\"javascript:user('edit.php?co="
           .base64_encode($b->path."/".$c)."')\">$c</A>";
         if(!FileSize($c)=="0"): 
         echo "<TD ALIGN=\"Right\" BGCOLOR=\"#C0E4C0\"><FONT 
         COLOR=\"#00A7FF\">".FileSize($c)."</FONT>
         <TD ALIGN=\"Right\" BGCOLOR=\"#FFC0C0\"><FONT COLOR=\#00A7FF\">"
          .StrFTime("%d.%m %Y %H:%M", FileCTime($c))."</FONT>\n<TD 
           BGCOLOR=\"#C0C0C0\"> <A HREF=\"soubory.php?delete="
           .base64_encode($b->path."/".$c)."\" 
         onclick=\"return confirm('Opravdu chceš soubor smazat ?')\">
           smazat</A>
           <A HREF=\"".base64_encode($b->path."/".$c)."\">stáhnout</A>"; 
         else: 
         echo "<TD><TD><TD>Vytvořeno <TD ALIGN=\"Right\"><FONT
          COLOR=\#00A7FF\">".StrFTime("%d.%m %Y %H:%M", FileCTime($c))."
          </FONT><TD BGCOLOR=\"#C0C0C0\"><A HREF=\"soubory.php?delete="
           .base64_encode($b->path."/".$c)."\" 
           onclick=\"return confirm('Opravdu chceš soubor smazat ?')\">
           smazat</A>\n"; 
         endif;
   endif;
echo "</TABLE>";
$b->Close();
?><P>
<FONT COLOR="#FF0000" SIZE=2>
pozn.: Aby se smazal adresář, musíte z něj nejprve odstranit všechny soubory
 a adresáře. Dříve to nebude možné.<P>
pozn.: Úprava obsahu binárních souborů naším editorem, může vést
 (a s největší pravděpodobností povede) k nefunkčnosti souboru.
</FONT>
<?
//patička
foot();
?>

Popíšeme si jej. Po načtení souborů a autorizaci jsou podmínky pro mazání. Jak jste si všimli, tak ke smazání je potřeba celá cesta ze které pomocí funkce Is_Dir() zístíme, zda se jedná o jméno souboru nebo adresáře. Podle toho pak použijeme patřičné funkce.

Následně zjistíme v jakém adresáři se budeme nacházet. Cestu budeme předávat v proměnné $ad. Pokud obsahuje prázdnou hodnotu, zobrazí se kořenový adresář. Ten získáme z předdefinované proměnné $PATH_TRANSLATED. Ta obsahuje cestu ke scriptu ve kterém je použita a pomocí fce DirName() dostaneme adresář, kde se nachází.

Následuje novinka. Podmíněný neboli ternární operátor (operátor, který má 3 operandy). Popíšeme si ho na našem příkladu. Pokud je první výraz ($ad==DirName($PATH_TRANSLATED)) pravdivý, vykoná se druhý výraz ($zobr=0) jinak se provede třetí ($zobr=1). Je to v zásadě zkrácení podmínky.

Pokračujeme hlavičkou. Tam jsem odstranil použití CSS, abych zachoval vzhled admin centra. Funkci head() tak musíme trochu pozměnit.

.
.
.
// standardní hlavička stránky
function head()
{
global $css;
?>
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1250">
<META HTTP-EQUIV="Author" CONTENT="Jiří Kocman and Ondřej Žižka">
<TITLE>Redakční Systém</TITLE>
<?
if($css!="true")
{
?>
<LINK href="./style.css" rel=stylesheet type=text/css>
<?
}
?>
</HEAD>
<BODY>
<?
}
.
.
.

Po definici funkcí, které nám otevřou okno, kde budeme přidávat soubory a adresáře již následuje samotný výčet souborů. Musíme vyčistit pamět (clearstatcache()) a přepnout se do adresáře, který budeme zobrazovat. Teď si celý adresář načteme do proměnné $b s pomocí funkce Dir(), jejímž parametrem je cesta k adresáři. V následném cyklu si do $c uložíme každou položku adresáře.

Funkce FileType() nám řekne co je položka zač. Může vrátit následující hodnoty fifo (zásobník), char (znakové zařízení), dir (adresář), block (blokové zařízení), link (odkaz), file (soubor) a unknown (neznámý). Pokud nám vrátí možnost "dir", jedná se o adresář. Ale pozor! Tento způsob zobrazování vrací také 2 hodnoty, které nebudeme používat je to ".", což je ukazetel na aktuální adresář a "..", který ukazuje o úroveň výše. Ten se nám hodí, ale pouze pokud se nejedná o kořenový adresář. Právě kvůli tomu jsme používali proměnnou $zobr, kde máme určeno, zda v kořenu jsme nebo ne. U ostatních adresářů použijeme druhou větev. Pokud se bude jednat o něco jiného něž adresáře (v našem případě nic jiného než soubory) a jejich velikost je větší než 0, zobrazíme informace, které jsou dostupné a nabídneme uživateli jeho stáhutí, editaci a smazání. V opačném případě pouze editaci a smazání.

Další script, který budeme potřebovat je adresar.php.

<?
Header("Pragma: No-cache");
Header("Cache-Control: no-cache");
Header("Expires: ".GMDate("D, d M Y H:i:s")."GMT");

// pokud neproběhla autorizace, ukončíme skript
if (!isset($PHP_AUTH_USER))
{
   echo "Neautorizovaný přístup";
   exit;
}

@include "../function.php";
@include "../conn.php";

// autorizace
auth();

if($send=="true" && $nazev!="" && $ad!="")
{
$ad=base64_decode($ad);
mkdir($ad."\\".$nazev,0700);
zavri();
}
else
{
head();
?>
<FORM METHOD="POST" ACTION="adresar.php">
<INPUT TYPE="HIDDEN" NAME="send" VALUE="true">
<INPUT NAME="ad" TYPE="HIDDEN" VALUE="<?=$ad?>">
<CENTER>
název adrersáře   <INPUT TYPE="TEXT" NAME="nazev" VALUE=""><BR>
<INPUT TYPE="SUBMIT" VALUE="odeslat">
</CENTER>
</FORM>
<?
foot();
}
?>

Jak jste si všimli, tak se nacházejí, na rozdíl od souboru soubory.php, v adresáři ./admin. Myslím, že zde je vysvětlování zcela zbytečné. Krátce a jednoduše. Po odeslání formuláře, se vytvoří soubor s požadovaným názvem a okno se uzavře. Nebudu zde vysvětlovat třetí parametr fce mkdir(), který udává práva přístupu k souboru. Samozřejmě, že jejich nastavení záleží na Vás.

Poslední potřebný soubor je upload.php, který nám, jak již název říká, slouží k uploadu souborů na server.

<?
Header("Pragma: No-cache");
Header("Cache-Control: no-cache");
Header("Expires: ".GMDate("D, d M Y H:i:s")."GMT");

// pokud neproběhla autorizace, ukončíme skript
if (!isset($PHP_AUTH_USER))
{
   echo "Neautorizovaný přístup";
   exit;
}

@include "../function.php";
@include "../conn.php";

// autorizace
auth();

if($soubor!="" && $ad!="" && $send)
{
$ad=base64_decode($ad);
move_uploaded_file($soubor,$ad."\\".$soubor_name);
zavri();
}
else
{
head();
?>
<FORM METHOD="POST" ACTION="upload.php" ENCTYPE="multipart/form-data">
<INPUT TYPE="HIDDEN" NAME="send" VALUE="true">
<INPUT TYPE="HIDDEN" NAME="ad" VALUE="<?=$ad?>">
<CENTER>
<B>Soubor</B><BR>
<INPUT TYPE="FILE" NAME="soubor" VALUE=""><BR>
<INPUT TYPE="SUBMIT" VALUE="Odeslat"><? butonek(); ?><BR>
</CENTER>
</FORM>
<?
foot();
}
?>

Script je velice podobný adresar.php jen s tím rozdílem, že místo vytváření adresáře se uploaduje soubor.

Ve všech třech scriptech jste se mohli setkat s funkcí base64_decode() a base64_encode(). Tyto funkce slouží k zakódování a odkódování textu, terý jim byl předán jako parametr. Používá se pouze pro přenos dat a nikoliv např. k uložení hesel do databáze, protože metoda Base64 je kódování, které je rozluštitelné. Na rozdíl třeba od MD5(), která vrací s vysokou pravděpodobností pro každý řetězec jedinečnou kombinaci znaků, která prakticky nejde rozluštit. Použil jsem ho proto, že kdyby se náhodou někde objevila URL adresa se strukturou našich adresářů jako parametrem, mohlo by lehce dojít k napadnutí našich souborů. Tento způsob předávání to alespoň trochu znenesnadňuje.
To by tedy bylo k editaci souborů. Příštím, tentokrát již posledním díle, si ukážeme ankety a dám ke stažení kompletní zdrojový kód našeho RS.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » PHP  

 » Rubriky  » Web  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: