Basic HTTP Authentication u PHP-u
Ako želite da zaštitite jednu stranicu sa šifrom, a nemate potrebu za nekim komplikovanim sistem zaštite, onda vam je dovoljno da iskoriste osnovnu HTTP autentikaciju (Basic HTTP Authentication).
Ovakav način kontrole pristupa je moguć na dva načina. Prvi je sa kombinacijom .htaccess i .htpasswd fajlova, da bi se sprečio pristup određenim direktorijumima i fajlovima na serveru. Ovi fajlovi sadrže podatke o korisnicima kojima je dozvoljen pristup tom direktorijumu, kao i njihove šifre. Drugi način je preko PHP-a, tako što će se klijent aplikaciji, najčešće je to browseru, poslati posebno zaglavlje, koje će browseru dati instrukcije za prikaz prozora za unos korisničkog imena i šifre.
PHP može da radi na više načina u okviru servera, kao Apache modul (mod_php), ili putem CGI/FastCGI interfejsa. Ova skripta podržava oba načina, pošto posto je male razlike, koje će biti objašnjene kasnije.
<?php
if (isset($_SERVER['HTTP_AUTHORIZATION']) &&
strpos(strtolower($_SERVER['HTTP_AUTHORIZATION']),'basic')===0)
{
list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) =
explode(':', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
}
$username = null;
$password = null;
if (isset($_SERVER['PHP_AUTH_USER']))
{
$username = $_SERVER['PHP_AUTH_USER'];
$password = $_SERVER['PHP_AUTH_PW'];
}
$users['user1'] = 'pass1';
$users['user2'] = 'pass2';
if (!(isset($users[$username]) && $users[$username] == $password))
{
header("WWW-Authenticate: Basic realm=\"Protected Page: Enter your ".
"username and password for access.\"");
header("HTTP/1.0 401 Unauthorized");
?>
<html>
<head><title>Authorization Failed</title></head>
<body>
<h1>Authorization Failed</h1>
<p>Without a valid username and password, access to this page cannot be granted.
Please click 'reload' and enter a username and password when prompted.</p>
</body>
</html>
<?php
die();
}
// ispod ovog mesta se postavlja kod koji treba da se prikaze kad se korisnik uloguje
?>
Objašnjenje koda
Zaglavlje koje će inicirati prikaz prozora izgleda ovako:
header("WWW-Authenticate: Basic realm=\"Protected Page: Enter your ".
"username and password for access.\"");
Ukoliko korisnik pritisne Cancel dugme, tada se izvršava ostatak koda koji je upisan ispod ovog zaglavlja. Što znači, browseru se šalje zaglavlje sa kodom 401 i HTML sa opisnom porukom problema koji se javio.
Kada korisnik unese ime i šifru to se vraća serveru na proveru. Ovde sad nastaju male razlike u kodu, koje zavise od toga da li je PHP pokrenut na serveru kao modul (mod_php) ili kao CGI. Modul će, po prijemu zahteva za prikaz stranice, potražiti stavku AUTHORIZATION, u okviru zaglavlja koje opisuje zahtev browsera, i automatski će odraditi dešifrovanje. U ostalim slučajevima mora se konfigurisati server tako da prosledi PHP-u i ovo zaglavlje, a često nismo u situaciji da to podešavamo, zato treba dodati sledeći tekst u .htaccess fajl, ako ga nema kreirajte ga (obratite pažnju da ima tačka na početku).
RewriteEngine on
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
Ova dva reda u htaccessu će obezbediti da se prosledi i ovo zaglavlje u vaš kod.
Skript koji je ovde prikazan možete naći u raznim verzijama na interentu, nisam ga ja izmislio, a razlog za pisanje ovo teksta sam naša u tome da mi je na mojim kompjuterima sve radilo kako treba, dok na serveru na internetu, kod je odbijao da radi. Tačnije prozor za unos imena i šifre je konstatno iskakao i ako su uneti podaci bili ispravno uneti. Tada sam ustanovio da na lokalnim mašinama se koristi mod_php, a da je na interent serveru FastCGI u pitanju.
Skriptu koju sam vam predstavio je najbolje snimiti u poseban fajl, i ubaciti je na sve strane koje zahtevaju zaštitu, putem include ili require komande. Prednost ovog pristupa, izradi login sistema, se ogleda u tome da često na raznim hosting servisima nemate pristup konzoli, pa da možete da kreirate fajl sa šiframa.
Ovo je jednostavan način za zaštitu, ali problem je to što se šifra i korisničko ime, u ovom slučaju, moraju nalaziti upisani u samom skriptu. Može se sve ovo proširiti, da se koristi baza podataka za ove potrebe, ali je to po meni nepotrebno komplikovanje, a druga stvar je što se ne može stilizovati. Basic Authencation se smatra nesigurnim rešenjem. Postoji i kvalitetniji sistem zaštite, koji za korisnika izgleda isto, preko HTTP Digest Auth, ali to ću ostaviti za neki drugi tekst.
Slika je preuzeta sa sajta Stock.XCHNG.
