Ik ben voor mijn project bezig met een login script. Dit wil ik uiteraard zo veilig mogelijk maken. Ik ben echter nog niet echt thuis is het veilig scripten en ben bang dat ik het juist erg onveilig ga doen.
Ik heb hier en daar wat over secure logins gelezen en heb begrepen dat het erg verstandig is usernames en passwords zowieso te encrypten. Dit kan blijkbaar d.m.v. md5 en sha1 encryptie. Is het echter ook mogelijk om deze beiden toe te passen? Dus op deze manier bijvoorbeeld:

$password = md5($_POST['password'];
$password = sha1($password); 

Het project moet een soort van board gaan worden - vrij uitgebreid dus. Stel dat ik de gebruikers op deze manier laat inloggen, is dit dan veilig genoeg? (dit is nog slechts een beginnetje):

<?php
//login.php

if ((!isset($_POST['username'])) || (!isset($_POST['password']))) {
echo "
<form action=\"login.php\" method=\"post\">
<input type=\"textfield\" maxlength=15 name=\"username\" /><br />
<input type=\"textfield\" maxlength=15 name="password" /><br />
<input type=\"submit\" name=\"submit\" /> <input type=\"checkbox\" value=1 name=\"cookie\" />
</form>
";
}
elseif ((isset($_POST['username'])) && (isset($_POST['password'])) $$ isset($_POST['submit'])) {
function mksecure($var) {
$var = htmlentities($var);
$var = mysql_real_escape_string($var);
$var = strip_slashes($var);
$var = strip_tags($var);
$var = md5($var);
return $var;
}

$username = @mksecure($_POST['username']);
$password = @mksecure($_POST['password']);
$cookie = @htmlentities($_POST['cookie']);

// Database connectie maken
include "dblink.php";

$query = "SELECT * FROM users WHERE (username='$username') AND (password='$password') LIMIT 1";
$result = @mysql_query($query) or die("<br />Fout bij inloggen<br />");
$match = @mysql_num_rows($result);
$get = @mysql_fetch_array($result);

if (($match == 1) && ($username == $get['username']) && ($password == $get['password'])) {
@setcookie ("username", $username), $time+3200);
@setcookie ("password", $password), $time+3200);
$httpreferer = $_SERVER['HTTP_REFERER'];
$time = date(h:i:s);
$date = date(d-m-Y);
$ip = @getenv("REMOTE_ADDR");
$query2 = "UPDATE users SET ((lastlogintime='$time') AND (lastlogindate='$lastlogindate') AND (referer='$httpreferer') AND (ip='$ip') WHERE ((username='$username') AND (password='$password'))";

header("Location: index.php");
}
else {
echo "U kon niet worden ingelogd.";
}

mysql_close();

}

?> 

Het script is zo nog erg incompleet maar ik vraag me af hoe ik het goed af kan maken nadat het script heeft herkend dat de username en password overeenkomen, en, is dit een goed begin?
Kan iemand mij daarnaast uitleggen wat de functies en de voordelen van sessies zijn bij een inlogscript? Dat heb ik nooit goed begrepen...

Alvast bedankt!
eerst md5 en dan sha1 is opzich veiliger, maar het maakt in principe niet uit, alleen als mensen bij je wachtworoden gaan kunnen komen word het lastig..
ik raad je aan: bind sessies aan ip, zet wachtwoorden met sha1 in je database, en zorg ervoor dat mensen alleen met a-z0-9 kunnen registereren (als naam dan he;))

en verder.. lees mijn tut over xss, daar kan ook nogal wat misgaan..

~huib

Reageren