1.16 Autenticering
Till att börja med måste jag påpeka att det inte finns
någon metod för autenticering av användare som är
helt säker. Om vi har tillgång till https kan vi vara rätt
säkra, men i annat fall går det alltid att snappa upp lösenord
mm. bara man verkligen vill...
Nedan visas en "quick'n'dirty" metod som räcker för
enklare behov och som är lätt att implementera. I kombination
med ssl krypterad https förbindelse är den troligtvis
tillräckligt säker. Utan ssl finns det ingen
helt säker metod.
En session + form metod
Enklaste sättet att få en grundläggande autenticering
är att skapa två små php-program. Det ena skall inkluderas
i absoluta början av de sidor som skall skyddas, det andra används
för att ge in loginuppgifter om så behövs.
Idén är följande:
- När man kommer till en sida som skall skyddas så kontrollerar
php om en session variabel är satt (i exemplet används $_SESSION[
"har_loggat_in" ]). Session variabler gäller för
den session vi har och är unika för varje enskild surfare
som använder siten för tillfället.
- Är inte denna variabel satt så skall vi skickas till
login.php. För att vi skall komma ihåg vilken sida
vi var på när autenticeringen misslyckades så sätts
sidans url som parameter till login.php
- Login sidan skall visa en form med anändarnamn och lösenord.
Dessutom sätts det in en "hidden" som ser till att
from= parametern inte glöms om sidan laddas om.
- För att inte visa lösenordet i adressraden skall method="POST"
användas för formen. Dessutom skall lösenordet inte
visas när vi skriver in det.
- Om vi skrivit in något i textboxarna och klickar på
OK, så kontrolleras först att det finns något i textboxarna.
Sedan kontrolleras att användarnamn och lösen är korrekta.
I exemplet är det en mycket simpel kontroll, medan i en mer omfattande
lösning skulle dessa kontolleras från t.ex. en databas.
- Om användarnamn och lösen är korrekta så sätts
en sessionvariabel som visar detta. I exemplet har jag bara "ja",
ni kan gärna ha ett mer komplicerat värde.
- Till sist så sändes vi tillbaka till den sidan som vi
försökte gå in på, men som krävde autenticering.
Kontroll av autenticeringen:
Vi kontrollerar om en viss sessionsvariabel är satt och om inte
så hänvisar vi till en loginform
<?php
# se till att sessionen startas. Behövs inte alltid - det
# beror rätt mycket på hur php är konfigurerat
session_start();
# använd gärna mer komplicerat värde på variabeln än "ja"
if ( ! isset ( $_SESSION[ "har_loggat_in" ] ) OR
strcmp($_SESSION[ "har_loggat_in" ], "ja") != 0 )
{
header("Location: login.php?from=" . $_SERVER["PHP_SELF"]);
}
?>
Login formen:
Visar formen men validerar även och sänder oss tillbaka till
sidan vi kom från om login var OK
<?php
session_start();
if ( isset( $_POST[ "login_name" ] ) AND
isset( $_POST[ "login_password" ] ) )
{
# för exemples skull en enkel koll mot
# hårdkodade användanamn och lösenord
if ( strcmp($_POST[ "login_name" ], "kalle") == 0 AND
strcmp($_POST[ "login_password" ], "hemligt") == 0)
{
# kom ihåg att login var OK
$_SESSION[ "har_loggat_in" ] = "ja";
# gå tillbaka till sidan vi kom från
header("Location: " . $_POST["from"] );
}
}
?>
<html>
<head>
<title>Login</title>
</head>
<body>
<form method="POST">
<table>
<tr>
<td>
Användarnamn:
</td>
<td>
<input type="text" name="login_name">
</td>
</tr>
<tr>
<td>
Lösenord:
</td>
<td>
<input type="password" name="login_password">
</td>
</tr>
<tr>
<td>
<input type="hidden"
name="from"
value="<?php echo $_REQUEST["from"] ?>">
</td>
<td>
<input type="submit" value="OK">
</td>
</tr>
</table>
</form>
</body>
</html>
Listning 1.16.2 - samples/login.php
Resultat av listning 1.16.2
Användningsexempel:
I de sidor som skall skyddas inkluderar man kolla_login.php
direkt i början. Prova på följande sätt:
- Klicka på länken"visa i separat fönster"
i exemplet nedan.
- Du borde få en loginform.
- Skriv kalle som användarnamn och hemligt som
lösen
- Klicka på OK
- Du borde nu får se texten:
"Här finns hemlig information som kräver att man loggar
in..."
- Stäng detta browserfönster och klicka på nytt på
länken nedan
- Du borde redan vara inloggad...
- Stäng det igen och klicka sedan på länken under
logout exemplet nedan
- Prova igen länken nedan. Den vill nu återigen ha lösenord.
<?php
include_once( "kolla_login.php" );
?>
<html>
<head>
<title>Hemlig sida</title>
</head>
<body>
<p>Här finns hemlig information som kräver att man loggar in...</p>
</form>
</body>
</html>
Observera att den enda ändringen som behövs på en sida
för att få den lösenordsskyddad är således
att man inkluderar kolla_login.php i början av filen...
Logout
För att logga ut behöver vi bara radera den session variabel
som säger att vi är inloggade:
<?php
session_start();
# förstör session variabeln som
# säger att vi loggat in
session_unregister("har_loggat_in");
?>
<html>
<head>
<title>Logout</title>
</head>
<body>
<p>Du är nu utloggad. För säkerhets
skull kan du stänga browsern</p>
</body>
</html>
WWW-Authentication
Man kan även skapa följande kod som inkluderas i början
av alla sidor som skall autenticeras.
OBS! På en Windows server med IIS fungerar den
dock bara om det ställts in att det skall tillåtas Basic
authorization - och detta är aldrig inställt för datorer
som inte har ssl. Desutom måste man ta bort Anonymous access för
siten. Eftersom man oftast inte har full kontroll över den server
man använder är denna metod i praktiken oanvändbar.
På en Linux maskin kan man dock prova - men studera först
länkarna under nästa rubrik...
<?php
# kontrollera om användaren är inloggad
if ( ! isset( $_SERVER[ "PHP_AUTH_USER" ] ) )
{
# Realm ordet får du hitta på själv
# Det fungerar så att om man loggat in på en viss sida som
# hör till en viss Realm, så kommer man automatiskt
# att vara autenticerad för alla andra sidor som
# hör till samma realm
# sänd auktoriseringsorder
header('WWW-Authenticate: Basic realm="Min Realm"');
header('HTTP/1.0 401 Unauthorized');
# om användaren tryckte på cancel kommer vi hit
echo "Detta kommer om användaren tryckte på Cancel";
exit;
}
else
{
# användaren har gett namn och lösen
# kontrollera om dessa är ok
if ( $_SERVER[ "PHP_AUTH_USER" ] != "kalle" OR
$_SERVER[ "PHP_AUTH_PW" ] != "hemligt" )
{
# om inte så visas ett meddelande
echo "Det finns ingen sådan användare!";
# och sidan avslutas
exit;
}
}
?>
Apache + .htaccess
Om man har Apache servern kan man använda .htaccess filer för
autenticering. Jag beskriver inte närmare på dessa sidor
utan hänvisar till t.ex.
http://hotwired.lycos.com/webmonkey/00/05/index2a.html
http://hotwired.lycos.com/webmonkey/html/97/08/index2a.html
http://www.php.net/manual/en/features.http-auth.php
|