Jak na stránku s personalizací pro uživatele ? Nebo na jednoduchý redakční systém?
Zákaz kešování(1)
Pokud chcete zakázat kešování stránek u uživatele, což je u stránek zabezpečených heslem celkem
vhodné, lze to udělat přes PHP následujícím kódem, odesílajícím patřičné hlavičky. Ovšem pozor, hlavičky se musí odesílat před jakýmkoliv výstupem (echo).
Header("Pragma: no-cache");
Header("Cache-control: no-cache");
Header("Expires: ".GMDate("D, d m Y H:i:s")." GMT");
Logovací formulář(6)
Začneme od konce. Tento formulář se uživateli ukáže, pokud není zalogován
if ($logged=="0" || empty($logged)){
echo "<form action=\"index.php\" method=\"post\"><div>n";
echo "<label for=\"login\">Jméno :</label><input type=\"text\" name=\"login\" id=\"login\"/>\n";
echo "<label for=\"pass\">Heslo :</label><input type=\"password\" name=\"pass\" id=\"pass\"/>\n";
echo "<input type=\"submit\" value=\"Přihlásit\" id=\"pass\"/>\n";
echo "</div></form>";
include "konec.php"; //korektní ukončení html stránky
exit;
}
Zalogování(2)
V pomyslném php souboru se bude toto nacházet nad formulářem a díky použití cookies i nad jakýmkoliv jiným výstupem
Toto je složitější řešení, využívá mysql.
$logged="0"; /* aby nedošlo k podstrčení proměnné logged */
if (!empty($login)){
$passhash=md5($pass."hehe"); /*heslo se hashuje - v databázi se nevyskytuje v původní podobě ale v podobě hashe, jednosměrně zašifrované*/
$select="SELECT * FROM users WHERE login='$login' AND heslo='$passhash'";
$logged=mysql_num_rows(mysql_query($select,$connection)); /*pokud se v databázi najde příslušná položka, bylo jméno a heslo odpovídající nějakému uživateli - potom je proměnná $logged 1*/
/* Potom nastavíme cookies. Cookies se musí nastavovat před jakýmkoliv výstupem (echo) */
setCookie("uziv","$login","0");
setCookie("heslo","$passhash","0");
}
Jednodušší verze:
if (!empty($login)){
$uzivatele=array(user1=>heslo, uzivatel=>heslo, nekdo_dalsi=>veslo); /* Pole se seznamem uživatelů a jejich hesel(nezašifrovaných) */
if($uzivatele[$login]==$pass){
$logged="1";
setCookie("uziv","$login","0");
setCookie("heslo","$pass","0");
}else {$logged="0"}
}
Ověření - na každé stránce(4)
Předchozí kod změní proměnnou $logged(a tím odliší zalogovaného) pouze, pokud se uživatel právě přihlašuje... co ovšem jindy? Musí se kontrolovat cookies... následující kod se nachází PO tom předchozím... ale stále ještě daleko před formulářem a prvním výstupem
Složitější :
if ($logged=="0"){
if (isset($HTTP_COOKIE_VARS['uziv'])){
$uziv = $HTTP_COOKIE_VARS['uziv'];}
if (isset($HTTP_COOKIE_VARS['heslo'])){
$heslo = $HTTP_COOKIE_VARS['heslo'];} /* v cookie je taktéž už zašifrovaná verze hesla (sami jsme jí tam nastavovali)*/
if (!empty($uziv)){
$select="SELECT * FROM users WHERE login='$uziv' AND heslo='$heslo'";
$q=mysql_query($select,$connection);
$logged=mysql_num_rows($q);
}
}
Bez MySQL:
if (isset($HTTP_COOKIE_VARS['uziv'])){
$uziv = $HTTP_COOKIE_VARS['uziv'];}
if (isset($HTTP_COOKIE_VARS['heslo'])){
$heslo = $HTTP_COOKIE_VARS['heslo'];}
$uzivatele=array(user1=>heslo, uzivatel=>heslo, nekdo_dalsi=>veslo); /* Možná by bylo lepší toto pole includovat, aby se nemuselo měnit na dvou místech dokumentu (případně lze určit nezávisle na podmínkách prostě jako první řádek php) */
if($uzivatele[$uziv]==$heslo){
$logged="1";}
Odlogování(3)
IF ($co=="logout"){
setCookie("uziv","","0");
setCookie("heslo","","0");
$logged="0";
}
Obsah(5)
Tak, nyní již stačí dát celý chráněný obsah do
if($logged=="1"){
}
a je to ...
Doufám, že tam nebudou chyby; já mám celý chráněný obsah v jedné stránce (obsah je dále ovládán poskytnutými proměnnými), ale mělo by to fungovat když toto dáte na každou chráněnou stránku... v patřičném pořadí :-)