Hallo,

De afgelopen week ben ik bezig geweest met een loginsysteem. Verschillende scripts heb ik bekeken en de stukken waarvan ik dacht dat het veilig was heb ik eruit gehaald. Ik wil graag weten hoe ik het systeem nog veiliger/beter zou kunnen maken.
Je moet bedenken dat dit een loginsysteem is voor klanten waarachter vertrouwelijke informatie staat, dus het moet goed beveiligd zijn.

index.php: http://www.codedump.be/code/420/
logout.php: http://www.codedump.be/code/421/
config.inc.php: http://www.codedump.be/code/422/
functies.inc.php: http://www.codedump.be/code/423/
database: http://www.codedump.be/code/425/

Alvast bedankt!
Interessant script. Echter denk ik dat er weinig mensen zijn die dit gaan uitzoeken voor je. Wat je beter kunt doen is een deel van je script laten zien waar jij je twijfels over hebt.
Oke,
Ik heb het over deze stukken, het inloggen en het checken of je bent ingelogd:

Inloggen:
<?php
/**
 * @author Arwin van der Velden
 * @copyright 2009
 * @name index.php
 */	
if(!isingelogd()) {
	// Anti-flood, na 5 keer verkeerd inloggen wordt je IP adres 24 uur geband
	$query = "SELECT COUNT(id) as attempts FROM ".$settings['db_login_attempts_table']." WHERE time < (NOW() - INTERVAL 24 HOUR) AND ip = '".$mysqli->real_escape_string($_SERVER['REMOTE_ADDR'])."' AND host = '".$mysqli->real_escape_string($_SERVER['HTTP_USER_AGENT'])."'";
	
	if ($result = $mysqli->query($query)) {	
		$login_attempt = $result->fetch_array();
		
		if($login_attempt['attempts'] > $settings['max_login_pogingen']) { // Controleren of je bent geband
			echo 'U bent tijdelijk geband<br>';
		} else {
	
			if (strtoupper($_SERVER['REQUEST_METHOD']) != 'POST') {						
				$formulier = true;
			} else {						
				$formulier = false;					
				if(ctype_digit($_POST['form']) && time() < strtotime("+1 minute", $_POST['form'])) { 				
					$username = htmlspecialchars($_POST['username']);
					$hashedPass = sha1($username.$_POST['pass']);
			 
			        $query = "SELECT ID FROM ".$settings['db_gebruikers_table']." WHERE gebruikersnaam = '".$mysqli->real_escape_string($username)."' AND wachtwoord = '".$mysqli->real_escape_string($hashedPass)."'";
			
					if ($result = $mysqli->query($query)) {
			
						$userId = $result->fetch_array();
			
				        if(ctype_digit($userId['ID'])) {			
				            $hash = sha1($userId['ID'] . $_SERVER['HTTP_USER_AGENT']);
				            // Cookies maken
				            setcookie('user_id', $userId['ID'], time() + 60*60*24*365, '/');
				            setcookie('user_hash', $hash, time() + 60*60*24*365, '/');            
				            // Update query samenstellen, ip en hash updaten
				         $sql = "INSERT INTO ".$settings['db_sessions_table']." (gebruikerID, hash, datum, ip) VALUES ( '".$mysqli->real_escape_string($userId['ID'])."', '".$hash."', NOW(), '".$mysqli->real_escape_string($_SERVER['REMOTE_ADDR'])."')";
				            // Query uitvoeren			
							if(!$result = $mysqli->query($sql))	{
							    trigger_error('Fout in query: '.$mysqli->error);
							} else {
							    if($mysqli->affected_rows > 0) { 
							    	echo 'Je bent ingelogd!';
							    }
							}									        
				        } else {				        	
				        	$sql = "INSERT INTO ".$settings['db_login_attempts_table']." (time, ip, host) VALUES ( NOW(), '".$mysqli->real_escape_string($_SERVER['REMOTE_ADDR'])."', '".$mysqli->real_escape_string($_SERVER['HTTP_USER_AGENT'])."')";				            
			
							if(!$result = $mysqli->query($sql)) {
							    trigger_error('Fout in query: '.$mysqli->error);
							}/*else {
							    if($mysqli->affected_rows > 0) { 
							    	echo 'Attempt ingevoerd<br>';
							    }
							}
				        	*/
							echo 'Het wachtwoord of gebruikersnaam was incorrect';
							$formulier = true;
						}
			
					} 
					
				} else {
					echo 'Fout bij inloggen. Probeer het opnieuw.';
				}
			
			}
			if($formulier) {
				echo '	<form method="post" action="'.end(explode('/', $_SERVER["REQUEST_URI"])).'"> 				
					<p><label>Username:</label><input type="text" name="username" value="" /></p>
					<p><label>Password:</label><input type="password" name="pass" value="" /></p>
					<br><input type="hidden" name="form" value="'.time().'" />						
					<p><input type="submit" value="Inloggen" /></p>						
					</form>
				';				
			}
			}
	}
 
} else {
	echo 'U bent al ingelogd.';
}
?>

/* ---------------------------------------------- */
	
Functie om te checken of je bent ingelogd:
<?php
function isingelogd(){
	global $settings, $mysqli;
    // Kijken of er cookies zijn gezet, en controleren of ze valid zijn
    if(isset($_COOKIE['user_id']) && ctype_digit($_COOKIE['user_id']) && isset($_COOKIE['user_hash']) && ctype_alnum($_COOKIE['user_hash'])) {
        $query = "SELECT gebruikerID FROM ".$settings['db_sessions_table']." WHERE gebruikerID = '".$mysqli->real_escape_string($_COOKIE['user_id'])."' AND hash = '".$mysqli->real_escape_string($_COOKIE['user_hash'])."' AND ip = '".$mysqli->real_escape_string($_SERVER['REMOTE_ADDR'])."'";
        
        // Query uitvoeren
		if ($result = $mysqli->query($query)) {

			$userId = $result->fetch_array();

            if(ctype_digit($userId['gebruikerID'])) {
                // Controleren of de hash ook klopt (browsercheck)
                if(sha1($_COOKIE['user_id'] . $_SERVER['HTTP_USER_AGENT']) == $_COOKIE['user_hash']) {
                    return true;
                } else { // Browser is veranderd
                    // Niet ingelogd
					$query = 'UPDATE '.$settings['db_sessions_table'].' SET hash = NULL, ip = \''.$mysqli->real_escape_string($_SERVER['REMOTE_ADDR']).'\' WHERE gebruikerID = \''.$mysqli->real_escape_string($_COOKIE['user_id']).'\'';
					
					$mysqli->query($query);
					
					// Cookies verwijderen
                    setcookie('user_id', 0, time() - 3600, '/');
                    setcookie('user_hash', '', time() - 3600, '/');        
                    return false;	                     
                }
                
            }   
		}     
        
    } else {    
    	// Geen geldige cookies gezet
        // Niet ingelogd
        return false;
    }        
}  
?>


Wat vinden jullie ervan? Hoe kan het beter en veiliger?
*dump*
Wat vinden jullie van het script hierboven? Hoe kan het beter en veiliger?

Reageren