Toon posts:

[php] login werkt niet als browser cache vol is?!

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik maak gebruik van een aangepaste versie van phpSecurePages.
Dit werkt op zich hartstikke goed, maar nu kom ik regelmatig in contact met gebruikers die plotseling niet meer kunnen inloggen. Na wat proberen is gebleken dat het legen van de cache van de browser (in dit geval Internet Explorer) de oplossing was.

Dit is het loginscript:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<?
session_start();
$sessionPath = session_get_cookie_params(); 
$encrypt     = new Encryption();
$errID       = NULL;

/*
** Function: show login-interface and stop script
**/
function setInterface($err = NULL){
    global $errID; 
    if(!is_null($err)) $errID = $err;
    setcookie("secUsr",     '', time()-3600, $sessionPath["path"], $sessionPath["domain"]);
    setcookie("secPwd",     '', time()-3600, $sessionPath["path"], $sessionPath["domain"]);
    # setcookie("secVersion", '', time()-3600, $sessionPath["path"], $sessionPath["domain"]);
    include("interface.php");
    exit();
}

/*
** Deal with submitted or cookie-saved login data
**/
if(isset($_COOKIE['secUsr'])     && $_COOKIE['secUsr']!="" &&
   isset($_COOKIE['secPwd'])     && $_COOKIE['secPwd']!=""){
   $secUser     = $_COOKIE['secUsr'];
   $secPwd      = $_COOKIE['secPwd'];
}elseif(isset($_POST["txtSecUsr"]) && $_POST["txtSecUsr"]!="" &&
        isset($_POST["txtSecPwd"]) && $_POST["txtSecPwd"]!=""){
   $secUser = $encrypt->AddEncryption($_POST["txtSecUsr"]);
   $secPwd  = $encrypt->AddEncryption($_POST["txtSecPwd"]);
}else{
   setInterface();  
}

/*
** Save login data into cookies
**/
setcookie("secUsr",     $secUser,       0, $sessionPath["path"], $sessionPath["domain"]);
setcookie("secPwd",     $secPwd,        0, $sessionPath["path"], $sessionPath["domain"]);

/*
** Verify login data
**/
if(!isset($secUser) || !isset($secPwd)) setInterface(0);

/*
** First check
*/
if($blnAdministration = ($encrypt->RemoveEncryption($secUser)==$admin['usr'])){
    /*
    ** Check password
    */
    if($encrypt->RemoveEncryption($secPwd)!= $admin['pwd'])
        setInterface(8);
}else{
    /*
    ** Use central user database
    */
    $sql = new query($db["host"], 
                     $db["db"], 
                     $db["user"], 
                     $db["pwd"]);
                 
    $sql->execute("SELECT * FROM
                        `tblUsers`      U 
                    WHERE 
                        (U.`txt_Username`  = '" . $encrypt->RemoveEncryption($secUser) . "')");

    /*
    ** Username should only appear 1 time
    **/
    if($sql->numrows==1){
        $sql->results();
        $results = $sql->data[0];
        /*
        ** Check case sensitive submitted username 
        **/
        if($encrypt->RemoveEncryption($secUser) != $results['txt_Username']) setInterface(2);
    
        /*
        ** Check if database user has a password
        **/
        if(!isset($results['txt_Password']) || 
            empty($results['txt_Password']) || 
            $results['txt_Password']=="") setInterface(3);

        /*
        ** Check case sensitive password
        **/
        # print $results['txt_Password'] . " : " . $encrypt->RemoveEncryption($results['txt_Password']) . "<br />";
        if(stripslashes($encrypt->RemoveEncryption($secPwd)) != $encrypt->RemoveEncryption($results['txt_Password']))
            setInterface(4);
    
        /*
        ** Check account (in)activity: n.v.t.
        **/
        # if(!$results['bln_Active']) setInterface(5);

        /*
        ** Check userlevel
        **/
        if(isset($requiredLevel) && ($requiredLevel!="" || !empty($requiredLevel))){
            if(is_array($requiredLevel)){
                if(!in_array($results['lng_Userlevel'], $requiredLevel)) setInterface(6);
            }elseif(is_int($requiredLevel)){
                if($results['lng_Userlevel']!=$requiredLevel) setInterface(6);
            }else{
                setInterface(6);
            }
        }
    
        /*
        ** Check userid
        */
        if(isset($requiredID) && ($requiredID!="" || !empty($requiredID))){
            if(is_array($requiredID)){
                if(!in_array($results['lng_UserID'], $requiredID)) setInterface(6);
            }elseif(is_int($requiredID)){
                if($results['lng_UserID']!=$requiredID) setInterface(6);
            }else{
                setInterface(6);
            }   
        }
    
        /*
        ** Login passed, set user vars
        **/
        $user['id']         = $results['lng_UserID'];
        unset($results);
    }else{
        setInterface(1);
    }
    $sql->Close();
    unset($sql);
}
unset($encrypt);
?>


en het script voor de interface:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<?
(ereg("php\.exe", PS) || ereg("php3\.cgi", PS) || ereg("phpts\.exe", PS))?
    $documentLocation = getenv($_SERVER['PATH_INFO']):
    $documentLocation = $_SERVER['PHP_SELF'];
if($_SERVER['QUERY_STRING']!="") $documentLocation .= "?" . $_SERVER['QUERY_STRING'];
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title><?=$_SERVER['HTTP_HOST'];?></title>
<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
<META NAME="ROBOTS" CONTENT="NONE">
<link href="/stylesheets/style.algemeen.css" rel="stylesheet" type="text/css" />
<style type="text/css">
body{
  text-align: center;
}
</style>
</head>

<body onload="javascript:document.getElementById('txtSecUsr').focus();">
<form action="<?=$documentLocation;?>" method="post" name="frmInloggen" target="_self" id="frmInloggen">
  <table id="tblInloggen" border="0" align="center" cellpadding="5" cellspacing="0">
    <tr>
      <th colspan="2"><?=TITLE;?></th>
    </tr>
<? 
if(!is_null($errID)){
    switch($errID){
        case 0:
            $msg = "U dient alle gegevens in te vullen!";
            break;
        case 1:
            $msg = "Gebruikersnaam niet gevonden!"; 
            break;
        case 2:
            $msg = "De gebruikersnaam is hoofdlettergevoelig!";
            break;
        case 3:     
            $msg = "Er is geen wachtwoord beken voor deze gebruiker!";
            break;
        case 4:
            $msg = "Het opgegeven wachtwoord is onjuist!";
            break;  
        case 5:
            $msg = "Uw account is (nog) niet geactiveerd!"; 
            break;
        case 6:
            $msg = "U heeft geen toegang tot deze pagina!";
            break;
        case 7:
            $msg = "Er is helaas iets misgegaan!";      
            break;
        case 8:
            $msg = "Ongeldige gevens ingevoerd!";   
            break;
        default:
            $msg = "Fout opgetreden!";
    }
    print "<tr>
            <td colspan=\"2\" id=\"errMsg\">$msg</td>
           </tr>";
}
?>  
    <tr>
      <td>Gebruiker : </td>
      <td><input name="txtSecUsr" type="text" id="txtSecUsr" maxlength="15" /></td>
    </tr>
    <tr>
      <td>Wachtwoord : </td>
      <td><input name="txtSecPwd" type="password" id="txtSecPwd" maxlength="15" /></td>
    </tr>
    <tr>
      <td colspan="2"><font color="#666666">Wachtwoord vergeten? klik <a href="<?=PROGDIR;?>xml/passmailer.php" target="_self">hier</a>.</font></td>
    </tr>
    <tr>
      <td colspan="2" align="right">
      <script type="text/javascript">
      <!--
      document.write('<input name="btnVersie" type="submit" id="btnVersie" value="verder" />');
      //-->
      </script>
      <noscript>
      <font color="#CC0000">Uw browser ondersteunt geen javascript!</font>
      </noscript></td>
    </tr>
  </table>
</form>
</body>
</html>


De security wordt in elke pagina als volgt aangeroepen:
PHP:
1
2
3
4
5
@require_once($_SERVER['DOCUMENT_ROOT'] . '/config/config.php');
if(!class_exists('phpDB')) die('Error: configuration failed!');
(defined("RSECDIR")) ?
    require_once(RSECDIR . "secure.php"):
    die("Error: secure directory not defined!");


Ik maak dus nu gebruik van cookies. Zou het helpen om dit om te zetten naar sessions? Volgens mij gebruiken sessions ook 1 cookie.

[ Voor 35% gewijzigd door Verwijderd op 20-07-2005 11:37 ]


Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Staat de datum en tijd wel goed op de server en of bij de client?

Misschien moet je het cookie niet laten verlopen en het server side opvangen?

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 19:06

Gerco

Professional Newbie

Ik heb geen oplossing voor je probleem, maar wel een opmerking:
Als ik het goed zie sla je het wachtwoord van de gebruiker op in de cookie?? Wat gebeurt er als ik die steel?

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
mja, de tijden staan allemaal gelijk ...
En hoe bedoel je: via de server laten opvangen?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
die wordt idd opgeslagen bij de gebruiker in een cookie. Wel goed versleuteld iig. Bovendien is de applicatie alleen door ons bedrijf te gebruiken en is de site niet voor anderen te benaderen.

Acties:
  • 0 Henk 'm!

  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 22-09 13:54

sopsop

[v] [;,,;] [v]

Het switchen naar sessie heeft iig niet tot gevolg dat je geen cookies meer gebruikt. Sessies gebruiken namelijk ook cookies.

Acties:
  • 0 Henk 'm!

  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 07-09 09:59
boppert schreef op woensdag 20 juli 2005 @ 12:05:
Het switchen naar sessie heeft iig niet tot gevolg dat je geen cookies meer gebruikt. Sessies gebruiken namelijk ook cookies.
dit is niet altijd zo, sessies kunnen 3 verschillende manieren gebruiken:
  • cookies
  • url-rewrite
  • hidden form field
ik weet niet hoe dit php ingesteld kan worden, ik werk enkel met java

"Live as if you were to die tomorrow. Learn as if you were to live forever"


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Als je een probleem hebt totdat je de cache leegt, waarom zorg je dan niet dat er voor je site überhaupt geen cache gebruikt wordt door een header te setten?

Trouwens, het is niet de bedoeling dat wij je gehele script voor je gaan debuggen. Je post een lap code met de melding "het werkt niet", en verwacht dat wij je code gaan debuggen. Ik zal dit topic open laten omdat ik me kan voorstellen dat het in dit geval lastig is om alleen relevante code te geven, maar bedenk je wel dat dit een volgende keer dus absoluut niet de bedoeling is.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
debuggen? Nee hoor ... ik leg uit wat mijn probleem is en laat de bijbehorende code zien ... ik vraag nergens: waar zit de fout? Ik vraag alleen of andere mensen dit probleem ook wel eens zijn tegengekomen en eventueel een oplossing weten.

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 22-09 15:11
Inderdaad gewoon wat headers toevoegen zodat de pagina niet wordt ge-cached

PHP:
1
2
3
4
5
6
7
8
<?php
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");    // Datum in het verleden
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
                                                     // Altijd veranderd
header("Cache-Control: no-store, no-cache, must-revalidate");  // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");                          // HTTP/1.0
?>  

Acties:
  • 0 Henk 'm!

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

zo te zien zit er een (potentieel) beveiligings gaatje in:
case 2: impliceert dat de gebruikersnaam wel bestaat, maar dat de hoofdletters niet op de juiste plek staan
case 4: impliceert dat de gebruikersnaam wél goed was

vanuit gebruikersoogpunt erg prettig; want je weet wat je fout hebt gedaan, vanuit 'hackers' oogpunt ook, want zo heeft iemand in elk geval al een v/d 2 componenten....

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ach de beveiliging is bij dit systeem niet zo heel erg belangrijk.
Het gaat meer om de profielen en voorkeuren die zo geladen worden.
De applicatie draait alleen intern, dus niet via Internet.
Normaal gesproken zijn de mededelingen idd niet zo duidelijk geformuleerd hoor.
Pagina: 1