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!
[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]
[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]
[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]
<?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;
}
?>
<?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