Scripts

Veilig loginsysteem (MySQL)

Met beveiliging voor Sessie hijacking, SQL injectie en maakt gebruik van password encryptie. Veiligheid kan ik met dit script niet garanderen, belangrijk is om altijd goed op te letten want je bent zelf verantwoordelijk. Ik weet dat er veel verschillende scripts op PHPhulp staan waarvan zeker meer dan de helft verouderd of niet veilig is. Met dit script wil ik dat beginnend PHP-end Nederland ook veilige websites kan maken. Getest op: * Windows 7 (64bit) met PHP 5.3.0, MySQL 5.1.36 en Apache 2.2.11 * Windows 7 (32bit) met PHP 5.3.0, MySQL 5.1.36 en Apache 2.2.11 * Windows XP (32bit) met PHP 5.3.0, MySQL 5.1.36 en Apache 2.2.11 * Debian 5.0 (??bit) met PHP 5.2.14, MySQL 5.1.51 en Apache 2.2.16 Volgende release: 01-01-2011 Komt nog: * Simpele registreer pagina * Logout pagina * Salt * Verbeterde foutafhandeling Voorbeeld (user: demo - pass: test) Download (V 1.1) Bug melding Graag onderbouwde kritiek in plaats van 'domme' opmerkingen. Bugs graag melden op de daarvoor bestemde website en niet bij de reacties. Zo kan alles sneller afgehandeld worden!

Login pagina (login.php)
[code]
<?php
session_start();

include 'conn.php';

	if($_SERVER['REQUEST_METHOD'] == 'POST')
	{ 

        $login_user = $Mysqli->real_escape_string($_POST['gebruikersnaam']); 
        $login_pass = $Mysqli->real_escape_string(sha1($_POST['wachtwoord']));
		$user_ip = $_SERVER['REMOTE_ADDR'];
		srand ((double) microtime( )*1000000);
		$session_id = rand(1000,1000000);
 
		$q1 = "
		SELECT 
			id,
			username,
			block
		FROM 
			users
		WHERE
			username = '".$login_user."'  
		AND
			password = '".$login_pass."'
		";

			if(!$r1 = $Mysqli->query($q1))
		{
		
			echo 'Er is een fout opgetreden!. '. $Mysqli->error;
		
		}
										
								
				elseif($Mysqli->affected_rows == 1)
				{
	

								while ($row = $r1->fetch_assoc ())
								{ 
								
										$_SESSION["username"] = $row['username']; 
										$_SESSION['user_id'] = $row['id'];   
										$_SESSION['user_ip'] = $user_ip;
										$_SESSION['session_id'] = $session_id;
											   
									if ($row['block'] == 1)
									{
										echo 'Je bent geblokkeerd, je kunt niet meer inloggen!';
									} 
										else 
										{ 
											//Inloggen gelukt!!
											header("location: " . 'index.php?msg=succes');
										}

								
	
	
					$q2 = "
					INSERT INTO
						sessions
					(
						user_id,
						session_id,
						user_ip
					)
					VALUES
					(
						'".$row['id']."',
						'".$session_id."',
						'".$user_ip."'
					)
					";
								}

									if (!$Mysqli->query ($q2) )
									{
									
										echo 'Er is een fout opgetreden!'. $Mysqli->error;
									
									}
								



				}
					else 
					{   
						echo 'Gebruikersnaam of wachtwoord onjuist, probeer het opnieuw!'; 
					}  
          
	} 
		else 
		{
			?>
				<html>
				<head>
				<title>Login</title>
				</head>
				<body>
				<h2>Login</h2>
				
				<?php 
					if(isset($_GET['error']))
					{
						if($_GET['error'] == 'sess')
						{
							echo 'De sessie is ongeldig! Log aub opnieuw in!<p>';
						}
					} 
				?>
					<form method='post'>  
								<table>  
									<tr>  
										<td>Gebruikersnaam:</td>  
										<td><input type='text' name='gebruikersnaam'></td>  
									</tr>  
									<tr>  
										<td>Wachtwoord:</td>  
										<td><input type='password' name='wachtwoord'></td>  
									</tr>  
									<tr>  
										<td><input type='submit' name='submit' value='Login'></td>  
									</tr>  
								</table>  
					</form>
					   
				</body>
				</html>           
		<?php
        }  
		?>
[/code]
MySQL
[code]CREATE TABLE IF NOT EXISTS `sessions` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `session_id` varchar(100) NOT NULL,
  `user_ip` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
[/code][code]
CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(100) NOT NULL,
  `password` varchar(100) NOT NULL,
  `block` int(1) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
[/code]
Default pagina (index.php)
[code]
<?php include 'check.php'; ?>
				<html>
				<head>
					<title>Index</title>
				</head>
				<body>
				<h2>Index</h2>
					
					<?php 
						if(isset($_GET['msg']))
						{
							if($_GET['msg'] == 'succes')
							{
								echo 'U bent succesvol ingelogd!';
							}
						} 
					?>

					   
				</body>
				</html>  
[/code]     
Connectie pagina (conn.php)
<?php

ini_set('display_errors', 'On');
error_reporting(E_ALL); 

	$db['host'] 				= 'localhost';
	$db['gebruikersnaam'] 		= 'root';
	$db['wachtwoord'] 			= '';
	$db['database'] 			= 'login';
	
	$Mysqli = new mysqli($db['host'], $db['gebruikersnaam'], $db['wachtwoord'], $db['database']); 
	
		if(mysqli_connect_errno())
		{
			echo 'Fout bij verbinding: '.$Mysqli->error;
		}
	
	?>
Check pagina (check.php)
<?php 
session_start();
if(!isset($_SESSION['session_id'])){
header("location: " . 'login.php?error=nosess');
}

include 'conn.php';

$q1 = "
		SELECT 
			id
		FROM 
			sessions
		WHERE
			session_id = '".$_SESSION['session_id']."' 
		AND
			user_ip = '".$_SERVER['REMOTE_ADDR']."' 
		AND
			user_id = '".$_SESSION['user_id']."'
		";

			if(!$r1 = $Mysqli->query($q1))
		{
		
			echo 'Er is een fout opgetreden!. '. $Mysqli->error;
		
		}
		
		elseif($Mysqli->affected_rows == 0)
				{
				//sessie niet gevonden
				header("location: " . 'login.php?error=sess');
				}
				?>

Reacties

0
Nog geen reacties.