I’m trying to write a class for authentication. I’ve got it going quite
good but there are some problems I’m not shure how to deal with.

First, here's the idea:
When the class is called, the constructor checks a session variable to
see if the user is logged in. If not, it checks if a client-cookie is
set.
If the user is already logged in, the checksession function checks a
database to see if ip matches and so on. If all that matces, the session
is updated. If on the other hand a client-cookie is set, the cookie is
compared to the database and if true, the session is updated.

Now, when the user logs in, he can check a box if he wants to
remembered. Then, a cookie is generated and sent to client.

The problem is, a cookie seems to be generated, even if I don't check
the check box. Further more, when I log in, the session seems to be set.
When I refresh, a cookie that isn't supposed to exist is checked and the
session variables don't work. Then if I refresh again the session is ok
but cookie is not checked etc...

If someone has the time it would be great if he or she could take a look
at the code. Thanks in advance for any help.

Class.auth.php
-----------------------------------------


<?php


class Auth {

        var $id=0;
        var $failed=false;
        var $debug;
        var $mysql=null;

        function auth($debug=0){
                $this->debug=$debug;
                $this->mysql=dbConnect($debug);
                if ($_SESSION['logged']) {
                        $this->_checkSession();
                }
                elseif ( isset($_COOKIE['auth']) ) {
                        $this->_checkRemembered($_COOKIE['auth']);
                }
        }


        function _checkLogin($username,$password,$remember){
                if($this->debug) echo "<b>checking login...</b><br>";
                if($remember="true"){
                        $remember=true;
                }
                else{
                        $remember=false;
                }
                $username=$this->mysqlEsc($username);
                $password=$this->mysqlEsc(md5($password));
                if($this->mysql->query("SELECT * FROM member WHERE
username=$username AND password=$password")){
                        if($this->mysql->num_rows() > 0){
                                while($this->mysql->movenext()){
                                        $values=$this->mysql->getrow();
                                }
                                $this->_setSession($values,$remember);
                                return true;
                        }
                        else{
                                $this->failed=true;
                                $this->_logout();
                                return false;
                        }
                }
                else{
                        print "could not connect db.";
                }
        }


        function _setSession(&$values,$remember,$init=true){
                if($this->debug) echo "<b>Setting session...</b><br>";

                $this->id = $values[id];
                if(!$values[cookie] && $remember==true){
                        $cookie=$this->generateCookie();
                        $_SESSION['cookie'] = $cookie;
                }
                else{
                        $_SESSION['cookie'] = $values[cookie];
                        $cookie=$values[cookie];
                }
                $_SESSION['uid'] = $this->id;
                $_SESSION['username'] =
htmlspecialchars($values[username]);
                $_SESSION['logged'] = true;
                if($remember==true) {
                        $this->updateCookie($cookie, true);
                }
                if($init) {
                        $session = $this->mysqlEsc(session_id());
                        $ip = $this->mysqlEsc($_SERVER['REMOTE_ADDR']);
                        $sql = "UPDATE member SET session=$session,
ip=$ip WHERE ".
                          "id = $this->id";
                        $this->mysql->query($sql);
                }
        }

        function _checkSession() {
                if($this->debug) echo "<b>checking session...</b><br>";
                $username = $this->mysqlEsc($_SESSION['username']);
                $cookie = $this->mysqlEsc($_SESSION['cookie']);
                $session = $this->mysqlEsc(session_id());
                $ip = $this->mysqlEsc($_SERVER['REMOTE_ADDR']);
                $sql = "SELECT * FROM member WHERE " .
                  "(username = $username) AND (cookie = $cookie) AND " .
                  "(session = $session) AND (ip = $ip)";
                if($this->mysql->query($sql)){
                        while($this->mysql->movenext()){
                                $result=$this->mysql->getrow();
                        }
                }
                if (is_object($result) ) {
                        $this->_setSession($result, false, false);
                }
                else{
                        $this->_logout();
                }
        }

        function updateCookie($cookie, $save) {
                if($this->debug) echo "<b>Updating cookie...</b><br>";

                $_SESSION['cookie'] = $cookie;
                if ($save) {
                        $cookie=$this->mysqlEsc($cookie);
                        $sql = "UPDATE member SET cookie=$cookie WHERE
".
                          "id = $this->id";
                        $this->mysql->query($sql);
                        $cookie =
base64_encode(serialize(array($_SESSION['username'], $cookie)));
                        setcookie('auth', $cookie, time() + 31104000,
'/', 'www.reddast.is');
                }
        }


        function generateCookie(){
                if($this->debug) echo "<b>Generating cookie...</b><br>";

                $cookie=md5(uniqid(mt_rand(1, mt_getrandmax())));
                return $cookie;
        }


        function deleteCookie($name) {
                if (!headers_sent() ) {
                        if($this->debug) echo "<b>Deleting
cookie...</b><br>";                     
                        $id=$this->mysqlEsc($this->id);
                        $sql = "UPDATE member SET cookie='' WHERE ".
                          "id = $this->id";
                        $this->mysql->query($sql);
                        setcookie($name, 'bogus', time() - 3600, '/');
                }
        }


        function _checkRemembered($cookie) {
                $cookie=base64_decode($cookie);
                if($this->debug) echo "<b>checking cookie
".$cookie."...</b><br>";
                list($username, $cookie) = @unserialize($cookie);

                if (!$username or !$cookie){
                        if($this->debug) echo "<b>Cookie does not
exist...</b><br>";                      
                        return;
                }

                $username = $this->mysqlEsc($username);
                //$cookie = $this->mysqlEsc($cookie);

                $sql = "SELECT * FROM member WHERE " .
                  "(username = $username) AND (cookie = $cookie)";

                if($this->mysql->query($sql)){
                        while($this->mysql->movenext()){
                                $result=$this->mysql->getrow();
                        }
                }

                if ($this->mysql->hm) {
                        if($this->debug) echo "<b>Cookie
exists...</b><br>";
                        $this->_setSession($result, true);
                }
        }

        function proxyIp($ip){
                $ip = explode('.', $ip);
                array_pop($ip);
                $ip = implode('.', $ip);
                return $ip;
        }

        function _logout(){
                sessionDefaults();
        }

        function mysqlEsc($str){
                return("'".mysql_escape_string($str)."'");
        }

}

?>



--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to