[PHP]Sessie waardes veranderen ongevraagd

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met het ontwikkelen van een twee-staps login-systeem. Hierbij wordt voorkomen dat het wachtwoord in plaintext over het internet wordt verstuurd.

Het probleem is dat de waardes in de sessie veranderen, waardoor de cliënt altijd gelijk krijgt.

Relevante PHP code is als volgt:
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
<?php
    
    // start de sessie
    session_start();
    
    // lees globale instellingen in
    require('/home/phserver.net/foktools/include/settings.php');
    
    // lees variabelen in
    $stage=isset($_POST['stage'])?$_POST['stage']:0;
    $username=isset($_POST['username'])?$_POST['username']:'';
    $password=isset($_POST['password'])?$_POST['password']:'';
    $loginkey=isset($_POST['loginkey'])?$_POST['loginkey']:'';
    
    // creëer overige variabelen
    $salt;
    $hash;
    
    switch ($stage)
    {
        case 0:
            // (nog) niets verstuurd, toon standaard login-pagina
            header('Content-Type: application/xhtml+xml');
            $file=fopen('login.xhtml','r');
            $contents=fread($file,filesize('login.xhtml'));
            fclose($file);
            echo $contents;
            break;
        case 1:
            // gebruikersnaam verstuurd, stuur salt en challenge
            getSaltHash($username);
            $challenge=randChallenge();
            $_SESSION['username']=$username;
            $_SESSION['loginkey']=md5($hash.$challenge);
            header('Stage: 1');
            header('Salt: '.$salt);
            header('Challenge: '.$challenge);
            break;
        case 2:
            // check gebruikersnaam en login-key
            if ($username==$_SESSION['username']&&$loginkey==$_SESSION['loginkey'])
            {
                // login succesvol
                $_SESSION['authorized']=true;
                header('Stage: 2');
                header('Success: true');
            }
            else
            {
                // foute username of wachtwoord
                header('Stage: 2');
                header('Success: false');
            }
            break;
        default:
            // er ging iets fout, stuur fout-pagina
            break;
    }


Zoals je kunt zien wordt in stage 1 de challenge én de oplossing voor deze challenge bedacht, en opgeslagen in de sessie. Dit gaat ook prima, ik heb een klein scriptje wat de volledige sessie-inhoud toont, en daar blijken de waardes gewoon te kloppen.

Echter, als de cliënt de eigen versie stuurt, wordt altijd de waarde in de sessie aangepast aan wat de client stuurt, en de vergelijking if ($username==$_SESSION['username']&&$loginkey==$_SESSION['loginkey']) is dus altijd waar.

De javascript-code die de challenge oplost en verstuurd is als volgt:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
var salt=request.getResponseHeader('Salt');
var challenge=request.getResponseHeader('Challenge');
var passhash=hex_md5(salt+password);
var loginkey=hex_md5(passhash+challenge);

request=new XMLHttpRequest();
request.onreadystatechange=processResponse;
request.open('POST','/user/login/',true);
request.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
alert('stage=2&username='+username+'&loginkey='+loginkey);
request.send('stage=2&username='+username+'&loginkey='+loginkey);
document.getElementById('status').firstChild.nodeValue='Bezig met inloggen (2/2)';
break;


Ik heb hier een klein alertje ingebouwd, om te kijken wat er precies verstuurd wordt, en als ik de sessie bekijk vóórdat ik de alert wegklik, klopt alles nog, maar na het versturen wordt de sessie op de een of andere manier overschreven.

Heeft iemand enig idee hoe dit kan?