några sidor på nätet om PHP programmering

Sök efter  
Börja här Uppgifter Testa dig själv Tips Sidokarta mm. Länkar Sök

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:

  1. 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.

  2. Ä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

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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"]);
    }

?>
Listning 1.16.1 - samples/kolla_login.php
[Visa i separat fönster]

 

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

Login
Användarnamn:
Lösenord:
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:

  1. Klicka på länken"visa i separat fönster" i exemplet nedan.

  2. Du borde få en loginform.

  3. Skriv kalle som användarnamn och hemligt som lösen

  4. Klicka på OK

  5. Du borde nu får se texten:
    "Här finns hemlig information som kräver att man loggar in..."

  6. Stäng detta browserfönster och klicka på nytt på länken nedan

  7. Du borde redan vara inloggad...

  8. Stäng det igen och klicka sedan på länken under logout exemplet nedan

  9. 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>
Listning 1.16.3 - samples/login_exempel.php
[Visa i separat fönster]

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>
Listning 1.16.4 - samples/logout.php
[Visa i separat fönster]

 

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;
    }
}
?>
Listning 1.16.5 - samples/kolla_login2.php
[Visa i separat fönster]

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

 

   Börja härAutenticering