Jednoduché zaheslování stránek
Občas je výhodné omezit přístup k některým částem vašeho webu. To lze řešit mnoha způsoby a samozřejmě i pomocí PHP. Nejdřív musíme vytvořit stránku s formulářem.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>Přístup na chráněnou stránku</title>
<meta http-equiv="Content-type" content="text/html; charset=iso-8859-2">
</head>
<body>
<form method="post" action="login.php">
<table border="0" cellpadding="0" cellspacing="0">
<tr><td>Login:</td><td><input type="text" name="log" size="20"></td></tr>
<tr><td>Heslo:</td><td><input type="password" name="pwd" size="20"></td></tr>
<tr><td colspan="2"><input type="submit" name="submit" value="Odeslat"></td></tr>
</table>
</form>
</body>
</html>
Pomocí tohoto formuláře odešleme skriptu heslo a login. V dalším souboru zpracujeme získané údaje.
<?php
Define ('file', 'pswd.txt'); //CESTA K SOUBORU S HESLY
Define ('server','http://muj.server.cz/'); //ADRESA WWW STRANEK
$data = @File(file) or Die('Nastala chyba'); //NACTENI OBSAHU SOUBORU DO POLE
foreach ($data AS $v)
{
List ($pswd, $login) = Explode (':', $v); //ROZDELENI RADKU NA HESLO A LOGIN
if (Trim($login) == Trim($_POST['log']))
{
if (Trim($pswd) == MD5(Trim($_POST['pwd'])))
{
//POKUD JE HESLO A LOGIN SPRAVNE PRESMERUJEME SKRIPT NA CHRANENY SOUBOR
Header ('Location: '.server.'top_secret.php?pswd='.$pswd.'&login='.$login);
exit;
}
else
{
Header ('Location: '.server.'bad_login.php'); //SPATNY LOGIN
exit;
}
}
}
Header ('Location: '.server.'bad_login.php'); //SPATNY LOGIN
exit;
?>
Nejdřív načteme soubor pswd.txt a rozdělíme ho na jednotlivé řádky. Tyto řádky pomocí funkce Explode() rozdělíme na heslo a login. Pokud najdeme login, který se shoduje s loginem odeslaným formulářem, tak porovnáme příslušná hesla. K šifrování hesel je zde využita funkce MD5() (lze samozřejmě použít jakoukoliv jinou). Pokud souhlasí i heslo, přesměrujeme skript na zaheslovaný soubor (pomocí URL předáme šifrované heslo). Pokud heslo nesouhlasí, přesměrujeme skript na stránku s chybovým hlášním. Stejně tak i v případě, že nenalezneme existující login. Použitím funkce Trim() se zbavíme zbytečných mezer na začátku a konci dat z formuláře.
Příklad souboru pswd.txt.
90a5986b4ad6a343034ee373b9dc59b9:hugo
e7459320144ddbca11855247ae117521:jirka
aa145cc54558842bb21aa77dac185672:lenka
54dd584c1447a4455e55411ee45e7745:pavel
Teď máme ošetřený přístup k souboru přes vstupní formulář. Ale pokud by někdo zjistil adresu souboru a zadal ji do prohlížeče, tak se mu zobrazí obsah i bez zadání hesla. Proto je lepší vložit kousek kódu přímo do začátek souboru, který chceme chránit.
<?php
Define ('file', 'pswd.txt'); //CESTA K SOUBORU S HESLY
Define ('server','http://muj.server.cz/'); //URL STRANEK
$data = @File(file) or Die('Nastala chyba'); //NACTENI OBSAHU SOUBORU DO POLE
foreach ($data AS $v)
{
List ($pswd1, $log1) = Explode (':', $v);
$pswd[] = Trim($pswd1);
$log[] = Trim($log1);
}
//NAJDEME POLOZKU POLE $log, KTERA ODPOVIDA ODESLANEMU LOGINU
$key = Array_Search ($_GET['login'], $log);
//POKUD JE LOGIN NEBO HESLO SPATNE, TAK PRESMERUJEME VYSTUP NA STRANKU
//S CHYBOVYM HLASENIM
if ($key === false || $pswd[$key] != $_GET['pswd'])
{
Header ('Location: '.server.'bad_login.php');
exit;
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>Super tajná stránka</title>
<meta http-equiv="Content-type" content="text/html; charset=iso-8859-2">
</head>
<body>
<h1>TOP SECRET - EYES ONLY</h1>
</body>
</html>
V tomto skriptu jsem použil jiný způsob prohledávání pole a to sice pomocí funkce Array_Search(), která vrací klíč prvku pole, jenž obsahuje zadaný řetězec. Pokud je login i heslo v pořádku tak se nám zobrazí obsah souboru, v opačném případě budeme přesměrováni na stránku s chybovým hlášením.
Tento způsob zaheslování přístupu k souborům je vhodný pouze pro html soubory, nedá se použít pro obrázky, příp. PDF dokumenty apod. Pro ochranu těchto souborů musíme využít databáze nebo ochranu pomocí souboru .htaccess.
Seznam použitých funkcí
LICENCE
Všechny skripty na tomto webu jsou poskytovány, pokud není uvedeno jinak, bez jakýchkoliv licenčních požadavků a také bez záruk.