Veilig login met sessies

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

PHP Scripter

PHP Scripter

15/12/2010 15:08:51
Quote Anchor link
Ik ben voor mijn eigen website bezig met het beheer systeem. Nu ben ik bezig om een login script te schrijven. Het onderstaande voert de login check uit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Code niet meer van toepassing

Is dit veilig om in de praktijk te gebruiken en hackers bestendig? Ik zit wel met een ander probleem. Nadat ik heb ingelogd, moet ik eerst de pagina opnieuw laden voordat ik de verborgen content ("Ingelogd") kan bekijken. Moet er verder alleen nog een check inbouwen om te kijken of het sessie id overeenkomt met het sessie id in de database.

Verder ben ik benieuwd of het werken met MD5 veilig is.
Gewijzigd op 16/12/2010 14:12:50 door PHP Scripter
 
PHP hulp

PHP hulp

25/04/2024 12:59:32
 
- Dave -

- Dave -

15/12/2010 15:14:12
Quote Anchor link
Het werken met MD5 is de laatste tijd telkens minder veilig aangezien er MD5 decrypters (crackers, brute forcers) zijn die miljoenen decrypted hashes hebben opgeslagen.
Je kan beter MD5 met een salt combineren of nog beter SHA1 met een salt.
Gewijzigd op 15/12/2010 15:17:13 door - Dave -
 
Jordi Kroon

Jordi Kroon

15/12/2010 15:20:00
Quote Anchor link
is het script veilig : ja het is opzich wel veilig

gebruik mysql_fetch_assoc ipv mysql_fetch_object

tip : wat je kan doen is dat hij de pagina nog een keer auto refreshed
 
PHP Scripter

PHP Scripter

15/12/2010 15:21:34
Quote Anchor link
Jordi, op zich wel veilig? Hoe kan ik het dan 'nog' veiliger maken? Ik heb de mysql_fetch aangepast. Auto refresh lijkt me overbodig, het moet toch anders op te lossen zijn?

Dave, aangepast naar SHA1.
Gewijzigd op 15/12/2010 15:23:37 door PHP Scripter
 

15/12/2010 15:29:24
Quote Anchor link
Let wel op dat je nog steeds een salt gebruikt: salt cryptography.
 
Jordi Kroon

Jordi Kroon

15/12/2010 15:32:33
Quote Anchor link
je kan het altijd veiliger maken
je kan ook je eigen salt maken bijvoorbeeld
alles is namelijk te hacken dus zeg nooit dit script is 100%veilig
 
PHP Scripter

PHP Scripter

15/12/2010 15:54:21
Quote Anchor link
Heb nog nooit met 'Salt & Pepper' gewerkt dus het leek me wel interessant! Doe ik het zo goed?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
sha1 ( $varSalt.$_POST["password"] )


En dan de string $varSalt is dan bijvoorbeeld: 1a2B3c4D
 

15/12/2010 16:38:35
Quote Anchor link
Jordi kroon op 15/12/2010 15:32:33:
je kan het altijd veiliger maken
je kan ook je eigen salt maken bijvoorbeeld
alles is namelijk te hacken dus zeg nooit dit script is 100%veilig


Wtf zit jij nu weer voor onzin te verkondigen?

PHP Scripter op 15/12/2010 15:54:21:
Heb nog nooit met 'Salt & Pepper' gewerkt dus het leek me wel interessant! Doe ik het zo goed?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
sha1 ( $varSalt.$_POST["password"] )


En dan de string $varSalt is dan bijvoorbeeld: 1a2B3c4D

Ja.
 
Obelix Idefix

Obelix Idefix

15/12/2010 16:40:25
Quote Anchor link
Maakt het nog uit of er AND of && wordt gebruikt?
In de select staat *; is het niet handiger om daar 1 of meer benodigde veldnamen neer te zetten?
Zorg voor foutafhandeling, geen 'or die'
Is het handig om een functie in een while-lus te definieren?
 
PHP Scripter

PHP Scripter

15/12/2010 16:47:16
Quote Anchor link
Karl Karl, oke dan weet ik dat.

Obelix:
# Ik weet niet waarom, maar ik gebruik altijd AND i.p.v. &&.
# Wat is hier het voordeel van? Vindt het nogal onnodig. Aangezien ik toch wel alle tabellen bijna gebruik.
# Ik heb de 'or die' eraf gehaald.
# Waarom niet? Zo wordt de functie alleen actief als de query OK is.
 

15/12/2010 16:47:51
Quote Anchor link
Obelix en Idefix op 15/12/2010 16:40:25:
Maakt het nog uit of er AND of && wordt gebruikt?

Ja: operator.precedence.

Obelix en Idefix op 15/12/2010 16:40:25:
In de select staat *; is het niet handiger om daar 1 of meer benodigde veldnamen neer te zetten?

Ja, je hoeft niet alle velden te hebben. Selecteer alleen de velden die je wilt weten. Nu kan je bijvoorbeeld id selecteren.

Obelix en Idefix op 15/12/2010 16:40:25:
Zorg voor foutafhandeling, geen 'or die'

Idd, or die is geen foutafhandeling.

Obelix en Idefix op 15/12/2010 16:40:25:
Is het handig om een functie in een while-lus te definieren?

Nee.
 
Jens V

Jens V

15/12/2010 16:51:43
Quote Anchor link
Obelix en Idefix op 15/12/2010 16:40:25:
Is het handig om een functie in een while-lus te definieren?


Lijkt me niet. Je gaat je functie elke keer je door je lus loopt opnieuw definieren zo... Maak hem liever een keer aan en gebruik hem dan in je while-lus.
 
PHP Scripter

PHP Scripter

15/12/2010 16:55:17
Quote Anchor link
De functie is inmiddels al uit de lus.
 

15/12/2010 16:55:23
Quote Anchor link
Jens V op 15/12/2010 16:51:43:
Obelix en Idefix op 15/12/2010 16:40:25:
Is het handig om een functie in een while-lus te definieren?


Lijkt me niet. Je gaat je functie elke keer je door je lus loopt opnieuw definieren zo... Maak hem liever een keer aan en gebruik hem dan in je while-lus.


Volgens mij is het zo dat die niet iedere keer weer opnieuw wordt aangemaakt (in ieder geval, als de intepreter / compiler slim is opgebouwd. Voor de logica van het script is het sowieso niet slim.
 
PHP Scripter

PHP Scripter

15/12/2010 22:41:13
Quote Anchor link
Heb laat op de avond nog even lopen knutselen. Het werkt nu prima, wil alleen de structuur nog iets anders opbouwen. En blijkbaar kan hij de sessies niet identificeren als de gebruiker nog niet is ingelogd. Logisch, maar hoe krijg ik die errors weg: "Undefined index"?

Uiteraard is de functie MakeRand() ook uit het script verdwenen.

Dit is wat ik heb tot nu toe.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
if ( !$_SESSION['SessionID'] AND !$_SESSION['UserID'] AND !$_SESSION['UserIP'] == $_SERVER['REMOTE_ADDR'] )
{

    if ( isset ( $_POST["login"] ) )
    {

        $objSql   = "SELECT * FROM users WHERE
                    UserName = '"
. mysql_real_escape_string ( $_POST["username"] ) . "' AND
                    UserPass = '"
. mysql_real_escape_string ( sha1 ( " . a1B2c3D4 " . $_POST["password"] ) ) . "' AND
                    UserIP = '"
. mysql_real_escape_string ( $_SERVER["REMOTE_ADDR"] ) . "' AND UserActive = '1' LIMIT 0,1";
        $objQuery = mysql_query ( $objSql );
            
        if ( mysql_num_rows ( $objQuery ) > 0 )
        {

            $objRow = mysql_fetch_assoc ( $objQuery );
                              
            $_SESSION["UserIP"] = $_SERVER["REMOTE_ADDR"];
            $_SESSION["UserID"] = $objRow["UserID"];
            $_SESSION["UserName"] = $objRow["UserName"];
            $_SESSION["UserNameDisplay"] = $objRow["UserNameDisplay"];
            $_SESSION["SessionID"] = MakeRand(50);
                    
            $objSql   = "UPDATE users SET
                        SessionID = '"
.mysql_real_escape_string ( $_SESSION["SessionID"] ) . "',
                        LastIP = '"
. mysql_real_escape_string ( $_SESSION["UserIP"] ) . "',
                        LoggedIn = LoggedIn +1
                        WHERE UserID = '"
. mysql_real_escape_string ( $_SESSION["UserID"] ) . "'";
            $objQuery = mysql_query ( $objSql );
                
            header ("Location: ./");
        }

        else
        {
            $showError = 'Er zijn onjuiste gegevens ingevoerd.';
        }
    }

    else
    {
        $showError = 'Om verder te gaan dient u in te loggen.';
    }
    
    $showPage = '
    <div class="loginfield">
                            
        <fieldset>
            
            <span style="color:red; font-weight: bold">'
. $showError . '</span><br /><br />
                        
            <form name="form1" method="post" action="">
                <label for="username">Uw gebruikersnaam:</label>
                <input type="text" class="username" name="username" /><br />
                <label for="password">Uw wachtwoord:</label>
                <input type="password" class="password" name="password" />
                <input type="submit" class="submit" name="login" value="Bevestig mijn login" />
            </form>
                    
        </fieldset>
                                
    </div>
    '
;
}

else
{                
    $showPage = "Logged in";
}

?>
Gewijzigd op 15/12/2010 22:44:25 door PHP Scripter
 
- SanThe -

- SanThe -

15/12/2010 22:47:24
Quote Anchor link
Zet ook de isset() voor de session-vars in de if().
 
Obelix Idefix

Obelix Idefix

15/12/2010 22:48:21
Quote Anchor link
PHP Scripter op 15/12/2010 22:41:13:
Logisch, maar hoe krijg ik die errors weg: "Undefined index"?

Kijk eens naar isset

edit: SanThe was me voor.
Gewijzigd op 15/12/2010 22:48:44 door Obelix Idefix
 
- SanThe -

- SanThe -

15/12/2010 22:51:24
Quote Anchor link
Antwoord verwijderd.
Was niet waar wat ik zei hier.
Gewijzigd op 15/12/2010 22:53:06 door - SanThe -
 
PHP Scripter

PHP Scripter

16/12/2010 14:12:05
Quote Anchor link
SanThe, dat klopt inderdaad. Die heb ik er nu ook instaan.

Is het loginscript verder prima zo? En is de opbouw logisch? Zit nog even te bekijken hoe ik het verder ga indelen qua pagina's etc....
 
PHP Scripter

PHP Scripter

17/12/2010 17:16:53
Quote Anchor link
Inmiddels heb ik gewoon de IP check eraf gehaald, anders kun je vanaf buitenaf niet inloggen. Maar wel een sessie IP check erop. Ik ga kijken of er nog meer beveiligings mogelijkheden zijn.
Gewijzigd op 17/12/2010 21:08:24 door PHP Scripter
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.