Upload - II a logout - 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:

Soutěž

Sponzorem soutěže je:

IDIF

 

Kdo je autorem výstavy obrazových fotografií „Očima Hanse Christiana Andersena“?

V dnešní soutěži hrajeme o:



PHP

Upload - II a logout

redakcni system

4. ledna 2002, 00.00 | Pokračujeme v tvorbě vlastního redakčního systému v PHP. Ukážeme si jak zasílat upozornění emailem a jak vyřešit autorizaci uživatele a jeho odhlášení.

Z minula nám chybí dokončit upozorňování na nedostatky článků. Jak jsem již naznačil, bude to prováděno zasláním emailu.

Vytvoříme si úplně nový soubor s názvem napis.php. Vypadat bude tahkle:

<?
Header("Pragma: No-cache");
Header("Cache-Control: no-cache");
Header("Expires: ".GMDate("D, d M Y H:i:s")."GMT");
@include "../function.php";
@include "../conn.php";
auth();
if($INFO[6]<2)
{
echo "Neautorizovaný přístup";
exit;
}
$sql=MySQL_Query("SELECT email FROM autori WHERE id='$id'");
$a=MySQL_Fetch_Row($sql);
$predmet="Připomínky k článku <B>$clanek</B>";
$zprava="Korektorovi se asi nelíbí váš článek.
         Přečtěte si poznámku ke článku.<BR><BR><BR>";
$zprava.="<I>Tento e-mail je generován. Prosím neodpovídejte na něj!!!</I>";
head();
If(@mail("$a[0]", "$predmet", "$zprava", "From:"))
 echo "Zpráva byla odeslána.";
else
  echo "Zprávu se nepodařilo odeslat.
        Kontaktujte <A HREF=\"\">šéfredaktora</A>";
foot();
?>

Teď si ho pěkně vysvětlíme. První tři řádky - neukládáme do cache. Další dva - načítání funkcí a spojení s databází. Samozřejmostí je autorizace. Z databáze vybereme email, na který se má zpráva poslat. Načteme si ho, aby byla adresa použitelná a připravíme si, co autorovi řekneme. Jelikož nás bude systém informovat, zda zpráva došla, zobrazíme hlášku jako standardní HTML stránku (funkce head() a foot()). Podmínka je jasná. Pokud se zpráva odešle dobře (fce Mail() vrátí true) vypíše se "Zpráva byla odeslána" v opačném případě "Zprávu se nepodařilo odeslat. Kontaktujte šéfradaktora." Ať si šéfík s tímhle problém poradí. Námitky ke článku si přečte v poznámce.

Nyní si řekneme něco k funkci Mail(). Je to poměrně užitečná fce, vždyť elektronickou poštu posíláme každý. Jak již víme, používá se k odeslání e-mailu. Má čtyři parametry. Všechny jsou typu string a jejich parametry jsou postupně tyto: cílová adresa, předmět, samotné tělo zprávy a poslední hlavičky. Funkce vrací true v případě úspěšného odeslání, jinak vrací false. Když chceme poslat více kopií, můžeme do prvního parametru napsat více adres oddělených mezerou. Poslední parametr je nepoviný, můžeme do něj nastavit přídavné hlavičky, které se pak stanou součástí hlavičky dopisu. Jako příklad uvedu: From: adresa, X-Mailer: zasílač a další. Pokud chcete odeslat nějakou přílohu, musí být obsažena v hlavičkách. Jak se to dělá o tom možná někdy jindy.

Ale pokračujme v začatém tématu: jak se na stránku pro odeslání emailů dostat? Musíme přidat pár řádků do scriptu korektura.php. Jsou to tyto příkazy:

<TR><TD ALIGN="Center" COLSPAN=2>
<A HREF="napis.php?id=<? echo $data[1]; ?>&clanek=<? echo $data[6]; ?>" 
TARGET="_blank"> Upozornit autora</A>
</TD></TR>

Je to jen odkaz, kde metodou GET předáváme číslo autora (pro výběr adresy) a název článku. Tento řádek tabulky si můžete umístit kam chcete. Já ho mám na konci tabulky.

Tento script se dá využít i jinak, stačí si pomocí formuláře nastavit jiné parametry a je to jednoduchý mailer. Ještě upozornění: hlavičku From: byste měli nastavovat na nějakou existující adresu. To aby bylo možné se bránit podivným emailům.

Ještě si dnes ukážeme logout. Trochu to rozeberu. Jak jistě víte, celý RS je založen na HTTP autentifikaci. To je právě ten problém. Při HTTP autentifikaci se předávají proměnné $PHP_AUTH_USER pro login, $PHP_AUTH_PW pro heslo a $PHP_AUTH_TYPE pro typ autentifikace. Ta poslední proměnná je taková zvláštní, protože jediný podporovaný typ autentifikace je BASIC. O jiném zatím nevím a pro jeden typ mi přijde proměnná zbytečná, avšak v budoucnosti se jistě máme na co těšit. Ale abych neodbočoval. Prohlížeč si login a heslo zjistí pomocí té windowsovské tabulky a pamatuje si je, dokud je spuštěný. Je tedy potřeba ho donutit, aby při logoutu ty proměnné jaksi zapomněl. Existuje několik způsobů: za prvé - měnit realm (to modré) v hlavičce po určitém časovém úseku.

Header("WWW-Authenticate: Basic realm=\"RS - Admin Center\"");

To ale vadí, pokud dlouho pracujete, protože se po určitém čase prohlížeč dotazuje na heslo a login. Druhou možností je jedinečný identifikátor obsažený v realm. To zase klade požadavky na kontrolu jeho platnosti v nějaké databázi. Třetí možností je poslat prohlížeči hlavičku o neutorizovaném přístupu i pokud jsou obě proměnné správné. Nakonec jsem ale použil jiný způsob, než jaké jsem zde zmiňoval, neboť první dva mi přišli příliš komplikované na tento projekt a u té třetí se mi to stále nějak nedařilo. Moje řešení má sice mouchy, ale svůj základní princip to myslím splňuje. Nejspolehlivějším způsobem stále zůstává zavřít okno browseru. Tím zajistíme, že prohlížeč heslo i login zapomene. Je to však velmi nepohodlné. Vyřešil jsem to tedy pomocí cookies. Tady jsou změny, které provedete ve scriptu menu.php. Tento řádek umístíme tam, kde se k němu dostanou všichni, to jest do nabídky, která se zobrazuje autorům.

echo "<A HREF=logout.php target=_top>Logout</A><BR>\n";

Script logout.php vypadá následovně:

<?
SetCookie("logout", 1 , Time()+5);
Header("Pragma: No-cache");
Header("Cache-Control: no-cache");
Header("Expires: ".GMDate("D, d M Y H:i:s")."GMT"); 
$str=SubStr($SCRIPT_NAME,0,StrRPos($SCRIPT_NAME, "/"));
Header("Location: http://$SERVER_NAME:$SERVER_PORT$str");
?>

Pozor!!! V hlavičce s Location musí být uvedena absolutní adresa. Z toho důvodu, jsem to nahradil několika příkazy. První řádka pošle cookie se jménem logout (později dostupné jako proměnná), hodnotou 1 (1= "true"), a platností pět sekund od okamžiku, kdy byl odeslán. Další prametry fce jsou cesta, doména a zabezpečení. První dvě mohou omezit cookie jen pro určitou doménu nebo dokonce script. Třetí parametr zajistí, že cookie bude odeslána pouze v případě, že jsme spojeni pomocí SSL (Secure Socket Layer), tedy šifrovaně. Stránku nebudeme ukládat do cache, aby se nám někdo nevrtal v historii a pak se divil, že se mu nedaří dostat se do administračního centra. Po kliku na LOGOUT se odešle cookies. Pokud script index.php zjistí, že tato proměnná je platná a má požadovanou hodnotu (true), zruší $PHP_AUTH_USER a $PHP_AUTH_PW. To znamená: při požadavku na autentifikaci se prohlížeč na tyto dvě proměnné dotazuje, ony však neexistují. Bohužel, ty největší problémy s asi jsou cookies. Někteří uživatelé jejich ukládání z obavy o svoji ochranu zbytečně vypínají. V takovém případě pak tento způsob nefunguje. Dokud cookies platí, nikdo se do admin centra nepřihlásí. Trvá to pět sekund. To vyplývá z toho, jak je to vytvořené. Interval si můžete nastavit vlastní. Stačí nastavit platnost cookie podle požadavku. Pokud někdo příjde na lepší nápad mile, rád se přiučím. Řekl bych, že tento způsob je snadno pochopitelný.

Ještě nám chybí něco ve scriptu index.php(./admin/index.php).

if($logout)
{
unset($PHP_AUTH_USER);
unset($PHP_AUTH_PW);
}

Nezapomeňte, že tahle podmínka musí být umístěna před autentifikací. Ještě důležitá věc. Když na přihlašovacím okně stisknete "Storno", počkáte pět sekund a zmáčknete na prohlížeči "Obnovit", dostanete se znovu do admin centra. Stačí však párkrát stisknot "OK" a vše bude v pořádku. Na to je potřeba uživatele upozornit.

Příště trochu pozměníme schvalování článků v administračním centru.

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: