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.
Link gekopieerd
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?
Link gekopieerd
*dump*
Wat vinden jullie van het script hierboven? Hoe kan het beter en veiliger?
Link gekopieerd