Veilig login met sessies
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
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 -
gebruik mysql_fetch_assoc ipv mysql_fetch_object
tip : wat je kan doen is dat hij de pagina nog een keer auto refreshed
je kan ook je eigen salt maken bijvoorbeeld
alles is namelijk te hacken dus zeg nooit dit script is 100%veilig
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.
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?
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.
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 Idefix
Was niet waar wat ik zei hier.
Gewijzigd op 15/12/2010 22:53:06 door - SanThe -
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....
Gewijzigd op 17/12/2010 21:08:24 door PHP Scripter