Toon posts:

[PHP/MySQL] - Veiligheids check

Pagina: 1
Acties:
  • 66 views sinds 30-01-2008

Verwijderd

Topicstarter
Beste lezer,

Ik wil jullie uitdagen :9 Ik wil jullie uitdagen een fout te vinden in mijn code waardoor je eigenlijk in kunt loggen zonder de inloggegevens te weten. Want ik wil weten of de beveiliging wel goed is voordat dit het internet opgaat.

Oke, klein stukje uitleg. Ik heb een MySQL database, daarin staat de tabel "admin" en daarin de record/veld "verify". Als mensen in het formulier aangeven een cookie te willen. Wordt er een cookie gemaakt waarin de datum word verpakt in MD5, en deze wordt ook weggeschreven naar de database.

Ik heb dus telkens als iemand inlogt een andere code van 32 karakters, die zowel in de cookie als in de database staan, als deze worden vergeleken en ze zijn gelijk, krijgt iemand adminstatus, dat doe ik met behulp van $_SESSION, die op 1 wordt gezet.

Let op
  • Het is dus de bedoeling (en geen fout) dat er maar 1 gebruiker kan inloggen, hij is dus niet multiuser opgezet met een gebruikersdatabase
  • Het is ook de bedoeling dat die persoon achter dezelfde PC zit, wil hij gebruik maken van de cookie.
  • Dit is een EDIT, dus denk niet dat ripexx domme dingen post :D
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
<?php
/* Uitleg: Als je de login goed hebt, of er is een geldige cookie
(kom ik op terug in de code) word de $_SESSION op 1 gezet, 
dat staat gelijk aan adminstatus, oftewel...bij alle admin gerelateerde 
pagina's word eerst gekeken of de sessie 1 is.
*/
session_start();

//Als er al een sessie is (Je bent al ingelogd) stoppen we de check, en geven een
//link naar de admin pagina.
if($_SESSION['login'] == 1)
{   
    exit("<a href='$link_admin'>Admin panel</a>");
}

//Deze variabele is nodig om "instellingen.php" te betreden. In deze pagina staan
//wat algemene instellingen zoals de MySQL login, en links van root en admin 
//pagina.
define("ADMIN_FILE", "TRUE");
include("instellingen.php");

//Als je nog geen adminstatus hebt, hebben we sowieso MySQL nodig
mysql_connect("$mysql_loc","$mysql_user","$mysql_pass");
mysql_select_db("$mysql_db");

//Hier maak ik een nieuwe key, die vervolgens wordt opgeslagen in database 
//en cookie.
function newkey()
{
    //Nieuwe key aanmaken
    $new_key = md5(date("jdGis"));
    //Cookie update
    setcookie("session", $new_key, time()+999999, "/");
    //Database update
    $update = "UPDATE admin SET verify = '".$new_key."'";
    mysql_query($update) or die ("Login database fout - " . mysql_error());
}
//Goed, de vorige check was negatief (Je was nog geen admin)
    else 
    {
        //Checken of cookie gelijk is aan database key
        if(isset($_COOKIE['session']))
        {
            $sql = "SELECT verify FROM admin";
            $result = mysql_query($sql);
            //Sleutels maken
            $db_key = mysql_result($result, 0);
            $co_key = $_COOKIE['session'];
            //Sleutels vergelijken
            if($db_key == $co_key)
            {
                //Admin status
                $_SESSION['login'] = 1;
                //Nieuwe key maken
                newkey();
                //Link naar admin panel geven, en dan exit
                exit("<a href='$link_admin'>Admin panel</a>");
            }
        }
        //Sessie is 0, en er is geen cookie, of cookie is fout
        else
        {
                        //Als er op de Submitknop is gedrukt doen we dit
            if(isset($_POST['Submit']))
            {
                //haal alle troep uit de velden
                $user = trim(htmlentities($_POST['user']));
                $pass = trim(htmlentities($_POST['pass']));
                
                //Als ze leeg zijn
                if($user == "" || $pass == "")
                {
                    exit("<center>Toegang geweigerd<br>De velden zijn leeg</center>");
                }
                //Als ze onjuist zijn
                if($user != "admin" || $pass != "pass")
                {
                    exit("<center>Toegang geweigerd<br>Onjuiste invoer</center>");
                }
                //Oke, user en pass zijn goed
                else
                {
                    //Admin status geven
                    $_SESSION['login'] = 1;
                    //Als herinneren is aangevinkt, cookie maken en 
                                        //database updaten
                    if($_POST['herinneren'] == TRUE)
                    {
                        newkey();
                    }
                    exit("<a href='$link_admin'>Admin panel</a>");  
                }
            }
                        //Geen sessie, geen cookie en er is nog niet op Submit gedrukt.
                        //laat het HTML formulier zien.
            else
            {
            ?>
            <form name="login" method="post" action="">
              <input name="user" type="text" id="user">Gebruiker
              <br>
              <input name="pass" type="password" id="pass">Wachtwoord
              <br>
              <input name="herinneren" type="checkbox" value="TRUE">Opslaan op deze PC?<br>
              <input type="submit" name="Submit" value="inloggen">
            </form>
            <?php
                        //Alle lussen weer afsluiten.
            }
        }
    }
?>

[ Voor 49% gewijzigd door Verwijderd op 21-10-2006 20:12 ]


  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 11-02 22:38

ripexx

bibs

Ik snap niet waarom je een eigen cookie aanmaakt en gebruik maakt van het default sessie systeem van PHP? Dit systeem zorgt er al voor dat je sessie data beschikbaar is. Nu gebruik je een cookie, ik kan mij voorstellen dat je in sommige gevallen niet kan of wil beschikken. Dan bouw je je eigen systeem waarbij je een cookie gebruikt ter identificatie. Wat jij nu hebt gecreerd zorgt ervoor dat als ik thuis inlog en dan na x tijd (langer dan sessie tijd) opnieuw de pagina benader ik direct wordt ingelogd. Alleen als ik nu op PC y ook heb ingelogd is mijn key niet meer valid en moet ik als nog inloggen. Dus dat lijkt mij niet heel wenselijk. ook biedt dit systeem nog geen ondersteuning voor meerdere gebruikers.

Verder zou ik je aanraden je code iets meer te stuctureren en zaken beter bij elkaar te plaatsen. Je harhaald nu stukken code die je heel eenvoudig kan vervangen.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function generatekey()
{
    return md5(date("jdGis"));
}

function dologin()
{
    $newkey = generatekey();
    
    $_SESSION['login'] = 1;
    setcookie("session", $newkey, time()+999999, "/");

    etc..
}

function isloggedin()
{
    return ($_SESSION['login'] == 1);
}

Voordeel is dat je logische blokken gaat creeren en je eenvoudig zaken kan herstructureren. Bijvoorbeeld je wil iets hergebruiken of iets veranderen, bijvoorbeeld er een geheel eigen loging systeem maken. In dat geval hoef je maar een paar functies aan t epassen ipv alle stukken code. Natuurlijk is het niet nodig om alles heel ver op te splitsen maar enige structuur is altijd wenselijk.

Ook zou ik je adviseren om zeer goed en consequent gebruik te maken van single en doublequotes incombinatie met strings en queries. Dit kan voor je het weet problemen opleveren. Ook is het niet altijd even overzichtelijk. Zo is het niet nodig om bij een functie aanroep met een string (mysql_connect() bijvoorbeeld) de variabelen te vorzien van quotes

PHP:
1
2
3
4
5
mysql_connect("$mysql_loc","$mysql_user","$mysql_pass"); 

// VS

mysql_connect($mysql_loc, $mysql_user, $mysql_pass);

buit is binnen sukkel


Verwijderd

Topicstarter
Beste ripexx,

Dankje voor je reply, een beetje dom van mijn topicstart, maar op de functions en quotes na, was het eigenlijk de bedoeling dat ik in kon loggen op 1 PC, en met 1 user. De functie van de cookie is inderdaad dat je dan niet elke keer hoeft in te loggen, en dat is vrijwel het enige dat hij doet.

Omdat het systeem gebruikt word door leken, weet ik niet hoe het zit met hun cookies ed. en valt met deze manier niet direct het hele systeem uiteen. De functions ga ik nog wel aanpassen, en ook zal ik mijn quotes nog even onder de loep nemen.

Hartelijk bedankt ripexx! :)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Zou je misschien ook even in woorden kunnen uitleggen wat je gedachten achter de code zijn? We kunnen wel je code lezen, maar we zullen dan nooit begrijpen waarom je bepaalde keuzes hebt gemaakt, en verder zullen veel mensen überhaupt de moeite niet nemen als er geen uitleg bij staat. ;)

'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.


Verwijderd

Topicstarter
Ik heb de code aangepast met meer comment, zodat je kunt zien wat er gaande is. Ook de TS is aangepast :)

Als er vragen zijn hoor ik het graag.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ten eerste vraag ik me af hoe wij kunnen weten dat deze code van jou is en we dus niet een manier aan 't verzinnen zijn om ergens 1 of andere login voor jou te omzeilen.
Ten tweede zie ik niet echt nut in dit topic; als het doet wat je wil wat het doet dan is het toch goed? Dan kun je relatief simpel controleren of je het kunt omzeilen door er zelf wat truukjes op los te laten. Als we hier aan gaan beginnen hebben we straks 200 topics staan met "kijk deze en deze code eens; kan iemand hier nog een lek/bug/whatever in vinden"?

[ Voor 16% gewijzigd door RobIII op 21-10-2006 20:21 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • GlowMouse
  • Registratie: November 2002
  • Niet online
Waarvoor is de else op regel 39?
Wat gebeurt er als ik direct naar $link_admin ga?
Als ik weet omstreeks welke tijd er is ingelogd, kan ik date("jdGis") gokken, cookie plaatsen, en je hele beveiliging omzeilen.

Ik zou eens kijken hoe andere loginforms werken.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
GlowMouse schreef op zaterdag 21 oktober 2006 @ 20:21:
Waarvoor is de else op regel 39?
Wat gebeurt er als ik direct naar $link_admin ga?
Als ik weet omstreeks welke tijd er is ingelogd, kan ik date("jdGis") gokken, cookie plaatsen, en je hele beveiliging omzeilen.

Ik zou eens kijken hoe andere loginforms werken.
Om met top-gear presentator Jeremy Clarkson's woorden te spreken: "...and on that bombshell..." vind ik het wel netjes geweest ;) Je hebt wat hints gehad en kunt daar wel wat mee lijkt me zo. Het is hier echter niet de bedoeling dat we voor jan-en-alleman code gaan zitten screenen op eventuele flaws; dat kun je als het goed is prima zelf (of desnoods je collega's o.i.d.) maar dit is niet het doel van PRG / GoT.

Je bent welkom om topics te openen in PRG met concrete vragen (zoals; "wat als ik ... zou proberen, zou dat mijn login omzeilen?" (nadat je het zelf geprobeerd hebt uiteraard)) maar in topics met een brede vraag als "kijk! code! Iemand iets op of aan te merken?" zie ik weinig heil. Als ik nog wat eigen initiatief had gezien (zoals: "zou dit of dat problemen kunnen opleveren?") had dit topic wellicht nog wel kans gemaakt, maar dit gaat me te ver.

[ Voor 43% gewijzigd door RobIII op 23-10-2006 01:10 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1

Dit topic is gesloten.