Veilig login met sessies
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:
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.
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
Gesponsorde koppelingen:
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.
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 -
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
gebruik mysql_fetch_assoc ipv mysql_fetch_object
tip : wat je kan doen is dat hij de pagina nog een keer auto refreshed
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.
Dave, aangepast naar SHA1.
Gewijzigd op 15/12/2010 15:23:37 door PHP Scripter
Let wel op dat je nog steeds een salt gebruikt: salt cryptography.
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
je kan ook je eigen salt maken bijvoorbeeld
alles is namelijk te hacken dus zeg nooit dit script is 100%veilig
Heb nog nooit met 'Salt & Pepper' gewerkt dus het leek me wel interessant! Doe ik het zo goed?
En dan de string $varSalt is dan bijvoorbeeld: 1a2B3c4D
En dan de string $varSalt is dan bijvoorbeeld: 1a2B3c4D
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
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:
Ja.
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?
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?
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.
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.
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.
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.
De functie is inmiddels al uit de lus.
Jens V op 15/12/2010 16:51:43:
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.
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.
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.
Uiteraard is de functie MakeRand() ook uit het script verdwenen.
Dit is wat ik heb tot nu toe.
Code (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
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";
}
?>
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
Zet ook de isset() voor de session-vars in de if().
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 en Idefix
Antwoord verwijderd.
Was niet waar wat ik zei hier.
Was niet waar wat ik zei hier.
Gewijzigd op 15/12/2010 22:53:06 door - SanThe -
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....
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....
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



