[PHP] Login systeem werkt lokaal goed,extern knalt hij eruit

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Theske
  • Registratie: Februari 2003
  • Laatst online: 14-05-2017
Goede avond,

Ik heb een website gemaakt met een inlogsysteem. Dat systeem heeft voorheen goed gewerkt en werkt lokaal nog steeds zoals het hoort te werken. Lokaal heb ik het getest op 4 pc's, met een succesvol resultaat.
(Daar komtie...)
Maarrrr..... wanneer iemand extern probeert in te loggen gaat het niet goed. Althans, het inloggen gaat prima, maar zodra dr op een link wordt geklikt, waarna hij de sessie/cookie/registratie in db checkt, knalt hij er weer uit(!). Sommige krijgen de extra functionaliteit te zien, sommige niet. Diegene die de extra functionaliteit te zien krijgen en dr op klikken worden weer teruggestuurd naar de login pagina.

Vermoedelijk ligt het aan de cookies/sessie die niet goed geregistreerd worden. De users staan wél juist in de database, in de login tabel. Dát wordt dus wel goed geregistreerd.

Kunnen jullie voor mij achterhalen waarom de loginfunctie wél lokaal (op 4 pc's) werkt maar niet extern? Alvast hartelijke dank!

Bij elke beveiligde pagina:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?
if(FALSE!==($rDbConn=connectdb()))
{
    if(!check_login($rDbConn))
    {
        header('location: login.php');
        exit;
    }
// inhoud
    mysql_close($rDbConn);
}
ob_end_flush();
?>

De check_login()
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
<?
function check_login($rDbConn)
{
    $bLogin=FALSE;

    if(empty($_SESSION['ingelogd']))
    {
        //niet aangemeld volgens sessie, wel volgens db?
        if(isset($_COOKIE['user_id']) && isset($_COOKIE['validate']) &&
                strlen($_COOKIE['validate'])==32 && preg_match('/^[0-9]{1,8}$/',$_COOKIE['user_id']) &&
                        preg_match( '/^[a-f0-9]{32}$/',$_COOKIE['validate']))
        {
            //de cookies bestaan en zijn geldig, kijken in de db
            $sQuery='SELECT COUNT(1) FROM logins
                    WHERE user_id='.$_COOKIE['user_id'].' AND validate="'.$_COOKIE['validate'].'"
                        AND client_ip="'.$_SERVER['REMOTE_ADDR'].'"
                        AND tijdstip>DATE_SUB(NOW(),INTERVAL 7 DAY)';
            if(!$rResult=mysql_query($sQuery,$rDbConn))
            {
                echo 'Hey een foutmelding: '.mysql_error($rDbConn).'<BR>'.$sQuery;
            }
            else
            {   
               
                if(mysql_result($rResult,0,0)==1)
                {
                    $bLogin=TRUE;

                    //de sessie gegevens schrijven
                    $_SESSION['ingelogd']=TRUE;
                    $_SESSION['client_ip']=$_SERVER['REMOTE_ADDR'];
                    $_SESSION['user_id']=$_COOKIE['user_id'];

                    //willekeurige string maken
                    $sValidate=md5(rand(0,99999));

                    //cookies setten voor 7dagen
                    setcookie('validate',$sValidate,time()+60*60*24*7,'/','sub.domein.nl');
                    setcookie('user_id',$_SESSION['user_id'],time()+60*60*24*7,'/','sub.domein.nl');

                    //de gegevens in de tabel zetten
                    $sQuery='REPLACE INTO logins (tijdstip, validate, user_id, client_ip)
                                VALUES (NOW(), "'.$sValidate.'", '.$_SESSION['user_id'].', "'.$_SERVER['REMOTE_ADDR'].'")';
                    if(!mysql_query($sQuery,$rDbConn))
                    {
                        echo 'Hey een foutmelding: '.mysql_error($rDbConn).'<BR>'.$sQuery;
                    }

                   
                    clean_up($rDbConn);

                    return $bLogin;
                }
            }
        }
    }
    elseif(isset($_SESSION['client_ip']) && $_SESSION['client_ip']==$_SERVER['REMOTE_ADDR']
            && isset($_SESSION['user_id']) && preg_match('/^[0-9]{1,8}$/',$_SESSION['user_id'])
            && isset($_SESSION['ingelogd']) && $_SESSION['ingelogd']===TRUE)
//            echo "client ip: '".$_SESSION['client_ip']." ' ";
    {
        return TRUE;
    }
    return FALSE;
}
?>

de functie connectdb()
Hij maakt wel gewoon prima connectie met de databae, daar ligt het probleem niet. Ter informatie is de functie toch even bijgevoegd.
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
<?
function connectdb()
{
    //inloggegevens van de database
    $sHost='localhost';
    $sUser='**';
    $sPass='**';
    $sDb='ek2008';

    if(!$rDbConn=mysql_connect($sHost,$sUser,$sPass))
    {
        echo 'Kon niet verbinden met de databaseserver';
        return FALSE;
    }
    else
    {
        if(!mysql_select_db($sDb,$rDbConn))
        {
            echo 'Kon de database niet selecteren';
            return FALSE;
        }
    }
    return $rDbConn;
}
?>

Proud member of the Cosmic Cows


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Erm mischien moet je een beetje gaan debuggen? Je zegt dat het vermoedelijk aan de cookies ligt, maar dat kun je toch makkelijk controleren. Vervolgens ga je kijken of de Client de cookies wel meestuurt, en als dat niet het geval is dan ga je kijken waarom niet!

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Eijkb
  • Registratie: Februari 2003
  • Laatst online: 13:44

Eijkb

Zo.

Wat is lokaal en wat is extern? Zou me kunnen voorstellen dat als jij op je Vista PC thuis een wamp installatie hebt draaien, externe IP adressen niets mogen wegschrijven op je PC. Ik zeg maar wat he.

Meer informatie a.u.b.

.


Acties:
  • 0 Henk 'm!

  • Theske
  • Registratie: Februari 2003
  • Laatst online: 14-05-2017
Klopt, ik ben ook al bezig geweet met debuggen, althans een poging tot.
Het kan zijn dat de andere cookies blokkeren, maar dan moet hij volgens mij door gaan met de sessie. Ook zal dan een probleem bij zijn, maar waar het precies aan ligt.... ik zou het niet weten, ik kom er gewoon even niet uit! :|

Ik zie in mijn cookies (van FF) wel een cookie met de naam PHPSESSID en met de inhoud 3ba504c8b944dac2c436dc25ea98fec6. De website naam is het lokale ip-adres van mijn server.
(dit is dus niet zoals ik hem heb gedefineerd...)

Misschien dat daar iets mis gaat? Maar bij mij kapt hij hem daar blijkbaar niet op af, want ik kan gewoon inloggen e.d. Hij zal dan verder lopen op de sessie.

Iemand suggestie voor debugging of een oplossing?

Proud member of the Cosmic Cows


Acties:
  • 0 Henk 'm!

  • Theske
  • Registratie: Februari 2003
  • Laatst online: 14-05-2017
Eijkb schreef op maandag 19 mei 2008 @ 23:07:
Wat is lokaal en wat is extern? Zou me kunnen voorstellen dat als jij op je Vista PC thuis een wamp installatie hebt draaien, externe IP adressen niets mogen wegschrijven op je PC. Ik zeg maar wat he.

Meer informatie a.u.b.
Lokaal is bij mijn thuis, op het netwerk wat hier draait. De server heeft gewoon een Win XP Pro installatie. Daarnaast hoeven ze niks weg te schrijven op mijn pc/server. Althans, de cookies en sessies worden weggeschreven op de pc van de gebruiker. Daarnaast kunnen ze gewoon gegevens wegschrijven in de database. Ze kunnen zich aanmelden en hun login tijdstip wordt verwerkt in de database.

edit:
Een vriendin van me was net wel gelukt om in te loggen en gebruik te maken van de extra functionaliteiten. Waarom bij haar wel en bij andere niet? Zoals ik al zei, cookies blokkeren kan een probleem zijn.. maar dan heb je de sessie nog, die in mijn ogen gewoon door kan gaan. Of zie ik dat verkeerd?

[ Voor 17% gewijzigd door Theske op 19-05-2008 23:16 ]

Proud member of the Cosmic Cows


Acties:
  • 0 Henk 'm!

  • fleppuhstein
  • Registratie: Januari 2002
  • Laatst online: 07-09 13:37
Ik wil je zeker wel helpen met debuggen, omdat het niet moeilijk is. Zeker als het je eigen script is namelijk :'( Puur nieuwsgierig, hoe kom je aan dit script ? Ik kan namelijk niet ander concluderen dan dat dit een vroege versie is van mijn login systeem, waarvan ik niet beter weet dan dat ik deze nog niet publiekelijk heb gemaakt.

Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 14:39

Johnny

ondergewaardeerde internetguru

Moet ik dan maar de eerste zijn om te zeggen dat dit script vatbaar is voor SQL-injectie door als bezoeker simpelweg de inhoud van een cookie aan te passen...

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 11:52

AW_Bos

Liefhebber van nostalgie... 🕰️

fleppuhstein schreef op maandag 19 mei 2008 @ 23:37:
Ik wil je zeker wel helpen met debuggen, omdat het niet moeilijk is. Zeker als het je eigen script is namelijk :'( Puur nieuwsgierig, hoe kom je aan dit script ? Ik kan namelijk niet ander concluderen dan dat dit een vroege versie is van mijn login systeem, waarvan ik niet beter weet dan dat ik deze nog niet publiekelijk heb gemaakt.
Dit script herken in uit een der artikels van phpfreakz.nl ;).

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


Acties:
  • 0 Henk 'm!

  • Theske
  • Registratie: Februari 2003
  • Laatst online: 14-05-2017
Ariën Clay schreef op dinsdag 20 mei 2008 @ 00:13:
[...]

Dit script herken in uit een der artikels van phpfreakz.nl ;).
Correct!

Ik heb nu de website naam uit de cookie gehaald, wellicht dat dat kan helpen.... ik ga dat zo testen op mn werk. Iemand nog andere suggesties?

Proud member of the Cosmic Cows


Acties:
  • 0 Henk 'm!

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
Aangezien je IP adressen in je cookies en sessies stopt (waarom :? ) hebben die gebruikers die er niet op kunnen waarschijnlijk een dynamisch IP?

Oh en wat Johny zegt:
PHP:
1
...WHERE user_id='.$_COOKIE['user_id'].' AND ...


Hmmmmm...

Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Theske schreef op maandag 19 mei 2008 @ 23:11:
[...]
Zoals ik al zei, cookies blokkeren kan een probleem zijn.. maar dan heb je de sessie nog, die in mijn ogen gewoon door kan gaan. Of zie ik dat verkeerd?
Wat is volgens jou het verband tussen een cookie en een sessie? Want als je dat niet begrijpt, is advies zinloos, omdat je dan binnen de kortste keren tegen het volgende probleem aanloopt.

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

  • Theske
  • Registratie: Februari 2003
  • Laatst online: 14-05-2017
Ik heb nu dus de website naam uit de cookie gehaald, en hij werkt op mn werk! Dat is bij de ING, waar ze een behoorlijke security policy hebben, dus ik hoop dat hij het ook bij de rest doet. Ik dubbelcheck dit nog even bij wat vrienden. Ik laat jullie weten wat eruit is gekomen.

Betreft SQL-injectie; good point! Ik had hier zelf eigenlijk niet bij stil gestaan. Ik zie dat het o.a. kan met mysql_real_escape_string. Ik ga me hier eens in verdiepen. Bedankt.

Verder ook bedankt voor de reacties, ik laat nog weten of het nu helemaal is gelukt met het probleem dat men niet kan inloggen of ingelogd kan blijven.

Proud member of the Cosmic Cows


Acties:
  • 0 Henk 'm!

  • Theske
  • Registratie: Februari 2003
  • Laatst online: 14-05-2017
Confusion schreef op dinsdag 20 mei 2008 @ 07:39:
[...]

Wat is volgens jou het verband tussen een cookie en een sessie? Want als je dat niet begrijpt, is advies zinloos, omdat je dan binnen de kortste keren tegen het volgende probleem aanloopt.
Een echt verband is er volgens mij niet. Je kan in beide gegevens opslaan, de cookie is te 'manipuleren' omdat deze op de pc van de gebruiker staat, de sessie staat op de server van de betreffende website. de gebruiker kan hier niet bij en is dus niet te manipuleren. Deze wordt ook afgebroken als de browser wordt gesloten. Bij de cookie is het pas als die verloopt.

Proud member of the Cosmic Cows


Acties:
  • 0 Henk 'm!

Verwijderd

Theske schreef op dinsdag 20 mei 2008 @ 07:56:

Een echt verband is er volgens mij niet. Je kan in beide gegevens opslaan, de cookie is te 'manipuleren' omdat deze op de pc van de gebruiker staat, de sessie staat op de server van de betreffende website. de gebruiker kan hier niet bij en is dus niet te manipuleren. Deze wordt ook afgebroken als de browser wordt gesloten. Bij de cookie is het pas als die verloopt.
Andere vraag dan. Hoe weet een server welke sessie bij welke client hoort, aangenomen dat een client tussen verschillende HTTP requests door de connectie sluit?

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
$sValidate is echt niet zo willekeurig, md5 kan 2128 waarden zijn, maar jij werkt maar met 100k verschillende hashes... :z Als je dergelijke key een stuk beter maakt, hoef je userid niet meer in een cookie te zetten, maar kan je het id bepalen adhv die key.

De queries zijn stom geschreven, het niet hebben van sql injections berust puur op een aantal meerdere keren in het script voorkomende preg_matches. Zet gewoon (ook) een cast naar int voor integers en een mysql_real_escape_string() voor strings in je queries, dan zie je direct bij de query zelf dat je goed zit. Doe geen mysql_error() in code op publieke servers, want zodra iets fout gaat met de query (halfbakken injection poging) is het de volgende keer meteen raak, etc. etc.

De hele stijl van het script ruk, pak een willekeurig PHP boek erbij en je leert ook wel in een van de chapters een login systeem, maar dan zonder de brakke (*&%@ code van phpfreakz.nl (of iig dit specifieke script). Verder moet je eerst de basis van cookies, sessies en queries begrijpen voordat je een dergelijk script aanpast. Dit script is met een kleine aanpassing of beginnersfout meteen een groot security risico.

{signature}


Acties:
  • 0 Henk 'm!

  • Theske
  • Registratie: Februari 2003
  • Laatst online: 14-05-2017
Het is inderdaad niet een van de beste stukjes script van mn website/applicatie. Zelf had ik niet zo heel veel verstand van cookies/sessions, dat ik maar via phpfreakz een 'mooie' logincode heb geplukt. Ik zal jullie opmerkingen zeker meenemen.
Zo leren we elke dag weer wat bij ;)

Proud member of the Cosmic Cows


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Theske schreef op maandag 19 mei 2008 @ 23:08:
Ik zie in mijn cookies (van FF) wel een cookie met de naam PHPSESSID en met de inhoud 3ba504c8b944dac2c436dc25ea98fec6. De website naam is het lokale ip-adres van mijn server.
(dit is dus niet zoals ik hem heb gedefineerd...)
En je Apache server is wel goed ingesteld?

Acties:
  • 0 Henk 'm!

  • Theske
  • Registratie: Februari 2003
  • Laatst online: 14-05-2017
Dit stond in httpd.conf of iets dergelijks toch?
Ik ga thuis direct even kijken.

Edit: nu de site leeg is krijg ik in ieder geval de juiste waarde mee in de cookie "[sub].[domein].nl"

[ Voor 39% gewijzigd door Theske op 20-05-2008 14:14 ]

Proud member of the Cosmic Cows


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

als ik zo de beschrijving van de TS lees en de reacties en de rest van de info is het eerste wat in m'n hoofd op komt de php ini setting session.autostart

Check daar de waarde eens van, zowel lokaal als online. ik zie je namelijk nergens een session_start() aanroepen in je code examples (al zegt dat niet alles)

:P

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

Verwijderd

Theske schreef op dinsdag 20 mei 2008 @ 07:56:
[...]

Een echt verband is er volgens mij niet.
Een sessie heeft een cookie nodig om levend te blijven. Bij een session_start zal je een cookie aanbieden aan de gebruiker, en indien die het cookie accepteert zal deze voor elke pageview een Cookie-header meesturen met de PHP session ID erin, die je session engine oppikt en de bijbehorende gegevens in $_SESSION voor je zet. Sessies hebben dus cookies nodig om te overleven.

Een goede hulp bij dit soort scripts is als je de headers kunt zien. Als je Firefox gebruikt, installeer dan eens de LiveHTTPHeaders addon, waarmee je HTTP verkeer kunt 'capturen' en kunt zien wat er wordt verstuurd. Dat zou je een belangrijk middel geven om problemen te kunnen analyseren, ook voor toekomstige problemen waar je tegenaan loopt.

Mijn advies: gebruik alleen een session ID en sla deze op in je database, met bijbehorende gegevens zoals IP en alles wat voor jou belangrijk is. Afhankelijk van een 'ip-lock' login-feature kun je dan de sessie weigeren als het IP niet overeenkomt met dat in de database; zodat niemand de cookies kan jatten om zelf toegang tot het account te verschaffen. Voor gebruikers met dynamisch IP is dit niet mogelijk (alhoewel je nog steeds op /24 of /16 zou kunnen locken). Deze kunnen de ip-lock checkbox dan uitvinken en deze feature bewust niet gebruiken. Voor hen geldt wel dat als iemand hun cookies jat, deze toegang kan krijgen.

Je kunt dit nog verder versterken door de sessie een levensduur te geven, en dat na x dagen of bij het sluiten van de browser er opnieuw ingelogd moet worden. Daarmee wordt ook een nieuwe sessie ID aangemaakt en de oude vervalt en wordt daarmee ongeldig. Zo bepaal je dus de maximum duur dat iemand met een gestolen cookie zonder ip-lock feature gebruik kan maken van het account.

Het beste van alles, is dat deze session-ID niet afgeleid is van je wachtwoord, en daarmee dus potentiëel veiliger is dan een ID die dat wel is, zoals een MD5-hash van het wachtwoord. Die laatste verandert niet tenzij het wachtwoord zelf verandert.
Pagina: 1