/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Ok, cookie login system
Fra : Sparre


Dato : 05-06-02 22:20

Dette er der sikkert blevet spurgt om MANGE gange før

Jeg sidder og leger lidt med et login system, som skal fungere, vha. mysql
og cookies. Det der tjekker om brugeren er logget ind skal sidde på alle
sider og så sende brugeren videre efter om han er logget ind også videre.
systemet skal bare gøre så brugeren ikke skal logge inde hver gang der
skiftes side, men forbliver logget ind...

Jeg er egentlig ikke interreseret i en masse snørklede forklaringer dem har
je fået mange af efterhånden, men det har ikke hjulpet. hvis nogen ligger
inde med et system der kan følgende, som jeg evt. kunne få lov at snuse lidt
til ville det være perfekt, jeg har endnu ikke fået mine forsøg til at
lykkedes på en ordentlig og nem måde.

Jeg håber inderligt at i kan forstå hvad jeg skriver, det er ved at være
lidt små sent såååå....


--
Christian Sparre
christian@sparre.it



 
 
Thomas Lindgaard (05-06-2002)
Kommentar
Fra : Thomas Lindgaard


Dato : 05-06-02 22:59

Davs

"Sparre" <christian@NOSPAMsparre.it> wrote in
news:igvL8.39309$4f4.1477823@news000.worldonline.dk:

> Jeg sidder og leger lidt med et login system, som skal fungere, vha.
> mysql og cookies. Det der tjekker om brugeren er logget ind skal sidde
> på alle sider og så sende brugeren videre efter om han er logget ind
> også videre. systemet skal bare gøre så brugeren ikke skal logge inde
> hver gang der skiftes side, men forbliver logget ind...
>

Jeg har et par klasser som kan det dér - dem må du da gerne snuse lidt til,
hvis det skulle være. Men de er meget sparsomt kommenteret indtil videre :)

--
Thomas Lindgaard
thomas@it-snedkeren.BLACK_HOLE.dk

Fjern det sorte hul hvis du vil sende mig noget

Sparre (06-06-2002)
Kommentar
Fra : Sparre


Dato : 06-06-02 09:54

> Jeg har et par klasser som kan det dér - dem må du da gerne snuse lidt
til,
> hvis det skulle være. Men de er meget sparsomt kommenteret indtil videre
:)

Meget gerne, det ville være super

--
Christian Sparre




Thomas Lindgaard (06-06-2002)
Kommentar
Fra : Thomas Lindgaard


Dato : 06-06-02 20:49

Davs

"Sparre" <christian@NOSPAMsparre.it> wrote in news:vqFL8.39379
$4f4.1501777@news000.worldonline.dk:

> Meget gerne, det ville v‘re super

Ok - here goes. Jeg skal prøvet at holde tungen lige i munden, så
forklaringen herunder giver mening... (?) Koden hænger forneden.

På hver af mine sider include'res en header.php (og footer.php). I
header.php står følgende linier:

$cookie = new Cookie(USER_COOKIE); // USER_COOKIE er navnet på
kagen
$user = new User();   

Cookie-constructoren parser den eksisterende USER_COOKIE hvis den findes
- den indeholder:
id - brugerens id i databasen
timestamp - timestamp for hvornår cookie er sat (det er også
skrevet i databasen)
ip - brugerens IP-adresse
password - brugerens kodeord i krypteret form

User-construktoren (hvis kaldt uden argument) går ind og henter brugeren
identificeret ved id i cookien.

På de beskyttede sider er indholdet pakket ind i en if-sætning:

if ( $user->authenticate() )
{
echo "du er en fin fætter, så du må se det hemmelige indhold";
}
else
{
echo "skrid, pomfrit!";
}

Authenticate går ind og checker den række i bruger-tabellen der er
identificeret ved id og sammenligner timestamp og kodeord. IP i cookien
checkes med maskinens IP. Hvis alt er ok kaldes metoden renewLogin(),
som sætter samme cookie igen blot med en nyt timestamp.

Hvis siderne ikke kræver login og der ikke er sat nogen kage, kommer
$cookie og $user bare til at indeholde nogle standardværdier.

Et par kommentarer:
1) User-klassen er en sub-klasse af Person, men denne gør for login-
systemets vedkommende ikke andet end at definere "hent bruger fra
databasen"-funktionen.
2) Syntaksen for et par funktioner:
SQL makeSQLSelect(select what, from table, where something)
SQL makeSQLUpdate(update table, set variables, where something)

Håber du kan få noget ud af det ellers må du sige til.
/Thomas


***** cookie.php:
<?php

   class Cookie
   {
      var $name, $content_array, $expire;
      
      function Cookie($name = "")
      {
         $this->name = $name;
         $this->expire = 0;

         if ( isset($_COOKIE[$name]) )
         {
            $old_cookie = $_COOKIE[$name];
            if ( ENCODE_COOKIES )
            {
               $old_cookie = base64_decode
($old_cookie);
            }
            $old_cookie = unserialize(stripslashes
($old_cookie));
            foreach ($old_cookie as $key => $value)
            {
               $this->add($key."=".$value);
            }
         }
         else
         {
            $this->content_array = array();
         }
      }
      
      function add()
      {
         foreach (func_get_args() as $cookie_var)
         {
            $key = strtok($cookie_var, "=");
            $value = strtok("=");
            
            $this->content_array[$key] = $value;
         }

         return $this->content_array;
      }
      
      function get($what)
      {
         $what = strtolower($what);
         if ( isset($this->content_array[$what]) )
         {
            return $this->content_array[$what];
         }
         
         return false;
      }
      
      function set($expire = 0)
      {
         if ( $expire != 0 )
         {
            $this->expire = $expire;
         }
         
         $content = serialize($this->content_array);
         if ( ENCODE_COOKIES )
         {
            $content = base64_encode($content);
         }
         
         return setcookie($this->name, $content, $this->
expire, "", "", 0);
      }
      
      function delete()
      {
         return setcookie($this->name, "", time() - 24 *
3600, "", "", 0);
      }
   }

?>


***** class_user.php:
<?php
   
   require_once "class_person.php";
   
   
   class User extends Person
   {
      var $authenticated;
      
      function User($id = "")
      {
         global $cookie;
         
         $this->Person();
         $this->authenticated = false;
         
         // Start with some defaults
         $this->info_array = array(
            "language" => DEFAULT_LANGUAGE,
            "visibleitems" => DEFAULT_VISIBLE_ITEMS,
            "logintimeout" => DEFAULT_LOGIN_TIMEOUT,
            "experiencelevel" => DEFAULT_EXPERIENCE_LEVEL
            
         );
         
         // Get user on id given as argument or secondly on
id in cookie
         $id = ( $id == "" ) ? $cookie->get("id") : $id;
         if ( $id )
         {
            $this->getOnID($id);
         }
      }
      
      function getOnLogin($login)
      {
         return $this->_getFromDatabase(makeSQLSelect("*",
"webusers", "login='".$login."'"));
      }
      
      function getOnID($id)
      {
         return $this->_getFromDatabase(makeSQLSelect("*",
"webusers", "id=".$id));
      }
            
      function _getFromDatabase($sql)
      {
         if ( parent::_getFromDatabase($sql) )
         {
            $this->_getPreferences();
            
            return true;
         }
         
         return false;
      }
      
      function _getPreferences()
      {
         global $db;
         
         $db->query(makeSQLSelect("*", "preferences", "id=".
$this->get("id")));
         if ( $preferences = $db->fetchArray() )
         {
            foreach ($preferences as $preference =>
$value)
            {
               if ( !is_integer($preference) )
               {
                  $this->set($preference, $value);
               }
            }
         }
      }
         
      function authenticate()
      {
         global $cookie, $page, $debug_box;
         
         // Authenticate user by comparing timestamps, IPs,
passwords and checking timeout
         if ( !$this->authenticated )
         {
            if ( $this->get("timestamp") > ($cookie->get
("timestamp") - 30) )
            {
               if ( $this->get("timestamp") <
($cookie->get("timestamp") + 30) )
               {
                  if ( time() < ($this->get
("timestamp") + $this->get("logintimeout")) )
                  {
                     if ( $this->get
("password") == $cookie->get("password") )
                     {
                        if ( $cookie->get
("ip") == getIP() )
                        {
                           $this->
renewLogin();
                           $this->
authenticated = true;
                        }
                     }
                  }
               }
            }
         }
         
         return $this->authenticated;
      }
      
      function login($login, $wanturl = "")
      {
         global $db, $url, $user_log;

         if ( $this->getOnLogin($login) )
         {
            if ( crypt($_POST["password"], $this->get
("password")) == $this->get("password") )
            {
               $timestamp = time();
               $db->query(
                  makeSQLUpdate("webusers",
"timestamp=".$timestamp, "id=".$this->get("id"))
               );
               
               $cookie = new Cookie(USER_COOKIE);
               $cookie->add(
                  "id=".$this->get("id"),
                  "timestamp=".$timestamp,
                  "ip=".getIP(),
                  "password=".$this->get
("password")
               );
               $cookie->set(time() + $this->get
("logintimeout"));

               $user_log->add(INFO, "Successful login:
".$login." => ".$_POST["password"]);
               
               // Redirect?
               $next_page = ( $wanturl != "" ) ?
$wanturl : $url->expand("welcome.php");
               
               Header("Location: ".
                  $url->expand("redirect.php",
"wanturl=".urlencode($next_page))
               );
               exit;
            }
         }
         
         $user_log->add(ERROR, "Failed login: ".$login." =>
".$_POST["password"]);
         
         return false;
      }
      
      function renewLogin()
      {
         global $db, $cookie;
         
         $timestamp = time();
         $db->query(makeSQLUpdate("webusers", "timestamp=".
$timestamp, "id=".$this->get("id")));
               
         $cookie = new Cookie(USER_COOKIE);
         $cookie->add("timestamp=".$timestamp);
         $cookie->set(time() + $this->get("logintimeout"));
      }
   }
   
?>

Jacob Volstrup (06-06-2002)
Kommentar
Fra : Jacob Volstrup


Dato : 06-06-02 02:03

> inde med et system der kan følgende, som jeg evt. kunne få lov at snuse
lidt
> til ville det være perfekt, jeg har endnu ikke fået mine forsøg til at

Jeg ved ikke om du kan bruge min sessionsstyring.. egentlig skal det jo blot
udbygges, sådan at når en bruger har logget ind, registreres det til den
enkelte session. Det kan så bruges på andre sider senere.
Uanset om du kan bruge det eller ej, så har jeg i alt fald vedlagt sovsen
til den...

Held og lykke

--
Mvh Jacob Volstrup
- www.netspecialisten.dk -


CREATE TABLE sessions (
id bigint(20) unsigned NOT NULL auto_increment,
php_sessid varchar(32) NOT NULL default '',
time varchar(32) NOT NULL default '',
ip varchar(15) NOT NULL default '',
adress varchar(60) NOT NULL default '',
browser varchar(120) NOT NULL default '',
active tinyint(1) NOT NULL default '0',
PRIMARY KEY (id),
UNIQUE KEY id (id),
KEY id_2 (id),
KEY id_3 (id)
) TYPE=MyISAM;

function session_update () {
# * * * * * * * * * * * #
# session_update #
# By Jacob Volstrup #
# volstrup@avanceret.dk #
# * * * * * * * * * * * #
global $REMOTE_ADDR, $HTTP_USER_AGENT;
session_start();
$ip = $REMOTE_ADDR;
$adresse = gethostbyaddr($ip);
$browser = $HTTP_USER_AGENT;
$sessId = session_id();
$time = time();
$newtime = $time + 3600; //timeout in seconds
$sql = "UPDATE sessions
SET aktiv = '0'
WHERE time < '$time'";
mysql_query($sql);
if (!SID) {
$sql = "SELECT * FROM sessions
WHERE php_sessid = '$sessId'
AND time > '$time'
AND active = '1'";
} else {
$sql = "SELECT * FROM sessions
WHERE ip = '$ip'
AND adress = '$adress'
AND browser = '$browser'
AND time > '$time'
AND active = '1'";
}
$data = mysql_query($sql);
if ($sessionsdata = mysql_fetch_array($data)) {
//session exists
$sessions_id = $sessionsdata["id"];
$sql = "UPDATE sessions
SET time = '$newtime'
WHERE id = '$sessions_id'";
mysql_query($sql);
} else {
//session doesn't exist
$sql = "INSERT INTO sessions (time, ip, adress, browser, active,
php_sessid)
VALUES('$newtime', '$ip', '$adress', '$browser', '1',
'$sessId')";
mysql_query($sql);
$sessions_id = mysql_insert_id();
}
return $sessions_id;
}




Mads Pedersen (08-06-2002)
Kommentar
Fra : Mads Pedersen


Dato : 08-06-02 10:46

Prøv at se på den her:
http://freshmeat.net/projects/phpsecurepages/

// Mads

> From: "Sparre" <christian@NOSPAMsparre.it>
> Organization: Customer of Tiscali A/S
> Newsgroups: dk.edb.internet.webdesign.serverside.php
> Date: Wed, 5 Jun 2002 23:20:10 +0200
> Subject: Ok, cookie login system
>
> Dette er der sikkert blevet spurgt om MANGE gange før
>
> Jeg sidder og leger lidt med et login system, som skal fungere, vha. mysql
> og cookies. Det der tjekker om brugeren er logget ind skal sidde på alle
> sider og så sende brugeren videre efter om han er logget ind også videre.
> systemet skal bare gøre så brugeren ikke skal logge inde hver gang der
> skiftes side, men forbliver logget ind...
>
> Jeg er egentlig ikke interreseret i en masse snørklede forklaringer dem har
> je fået mange af efterhånden, men det har ikke hjulpet. hvis nogen ligger
> inde med et system der kan følgende, som jeg evt. kunne få lov at snuse lidt
> til ville det være perfekt, jeg har endnu ikke fået mine forsøg til at
> lykkedes på en ordentlig og nem måde.
>
> Jeg håber inderligt at i kan forstå hvad jeg skriver, det er ved at være
> lidt små sent såååå....
>
>
> --
> Christian Sparre
> christian@sparre.it
>
>


Søg
Reklame
Statistik
Spørgsmål : 177554
Tips : 31968
Nyheder : 719565
Indlæg : 6408852
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste