2016-12-02 19:19:11 +00:00
< ? php
2018-10-12 15:49:58 +00:00
if ( isset ( $_POST [ 'Login' ] ) && isset ( $_POST [ 'username' ]) && isset ( $_POST [ 'password' ]) ) {
2016-12-02 19:19:11 +00:00
// Check Anti-CSRF token
checkToken ( $_REQUEST [ 'user_token' ], $_SESSION [ 'session_token' ], 'index.php' );
// Sanitise username input
$user = $_POST [ 'username' ];
$user = stripslashes ( $user );
2018-10-12 15:49:58 +00:00
$user = (( isset ( $GLOBALS [ " ___mysqli_ston " ]) && is_object ( $GLOBALS [ " ___mysqli_ston " ])) ? mysqli_real_escape_string ( $GLOBALS [ " ___mysqli_ston " ], $user ) : (( trigger_error ( " [MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work. " , E_USER_ERROR )) ? " " : " " ));
2016-12-02 19:19:11 +00:00
// Sanitise password input
$pass = $_POST [ 'password' ];
$pass = stripslashes ( $pass );
2018-10-12 15:49:58 +00:00
$pass = (( isset ( $GLOBALS [ " ___mysqli_ston " ]) && is_object ( $GLOBALS [ " ___mysqli_ston " ])) ? mysqli_real_escape_string ( $GLOBALS [ " ___mysqli_ston " ], $pass ) : (( trigger_error ( " [MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work. " , E_USER_ERROR )) ? " " : " " ));
2016-12-02 19:19:11 +00:00
$pass = md5 ( $pass );
// Default values
$total_failed_login = 3 ;
$lockout_time = 15 ;
$account_locked = false ;
// Check the database (Check user information)
$data = $db -> prepare ( 'SELECT failed_login, last_login FROM users WHERE user = (:user) LIMIT 1;' );
$data -> bindParam ( ':user' , $user , PDO :: PARAM_STR );
$data -> execute ();
$row = $data -> fetch ();
// Check to see if the user has been locked out.
if ( ( $data -> rowCount () == 1 ) && ( $row [ 'failed_login' ] >= $total_failed_login ) ) {
// User locked out. Note, using this method would allow for user enumeration!
//$html .= "<pre><br />This account has been locked due to too many incorrect logins.</pre>";
// Calculate when the user would be allowed to login again
2018-10-12 15:49:58 +00:00
$last_login = strtotime ( $row [ 'last_login' ] );
$timeout = $last_login + ( $lockout_time * 60 );
$timenow = time ();
/*
print " The last login was: " . date ( " h:i:s " , $last_login ) . " <br /> " ;
print " The timenow is: " . date ( " h:i:s " , $timenow ) . " <br /> " ;
print " The timeout is: " . date ( " h:i:s " , $timeout ) . " <br /> " ;
*/
2016-12-02 19:19:11 +00:00
// Check to see if enough time has passed, if it hasn't locked the account
2018-10-12 15:49:58 +00:00
if ( $timenow < $timeout ) {
2016-12-02 19:19:11 +00:00
$account_locked = true ;
2018-10-12 15:49:58 +00:00
// print "The account is locked<br />";
}
2016-12-02 19:19:11 +00:00
}
// Check the database (if username matches the password)
$data = $db -> prepare ( 'SELECT * FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' );
$data -> bindParam ( ':user' , $user , PDO :: PARAM_STR );
$data -> bindParam ( ':password' , $pass , PDO :: PARAM_STR );
$data -> execute ();
$row = $data -> fetch ();
// If its a valid login...
if ( ( $data -> rowCount () == 1 ) && ( $account_locked == false ) ) {
// Get users details
$avatar = $row [ 'avatar' ];
$failed_login = $row [ 'failed_login' ];
$last_login = $row [ 'last_login' ];
// Login successful
$html .= " <p>Welcome to the password protected area <em> { $user } </em></p> " ;
$html .= " <img src= \" { $avatar } \" /> " ;
// Had the account been locked out since last login?
if ( $failed_login >= $total_failed_login ) {
$html .= " <p><em>Warning</em>: Someone might of been brute forcing your account.</p> " ;
$html .= " <p>Number of login attempts: <em> { $failed_login } </em>.<br />Last login attempt was at: <em> ${ last_login } </em>.</p> " ;
}
// Reset bad login count
$data = $db -> prepare ( 'UPDATE users SET failed_login = "0" WHERE user = (:user) LIMIT 1;' );
$data -> bindParam ( ':user' , $user , PDO :: PARAM_STR );
$data -> execute ();
2018-10-12 15:49:58 +00:00
} else {
2016-12-02 19:19:11 +00:00
// Login failed
sleep ( rand ( 2 , 4 ) );
// Give the user some feedback
$html .= " <pre><br />Username and/or password incorrect.<br /><br/>Alternative, the account has been locked because of too many failed logins.<br />If this is the case, <em>please try again in { $lockout_time } minutes</em>.</pre> " ;
// Update bad login count
$data = $db -> prepare ( 'UPDATE users SET failed_login = (failed_login + 1) WHERE user = (:user) LIMIT 1;' );
$data -> bindParam ( ':user' , $user , PDO :: PARAM_STR );
$data -> execute ();
}
// Set the last login time
$data = $db -> prepare ( 'UPDATE users SET last_login = now() WHERE user = (:user) LIMIT 1;' );
$data -> bindParam ( ':user' , $user , PDO :: PARAM_STR );
$data -> execute ();
}
// Generate Anti-CSRF token
generateSessionToken ();
?>