(2) Impossible level
- <?php
-
- if( isset( $_POST[ 'Login' ] ) ) {
- // Check Anti-CSRF token
- checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
-
- // Sanitise username input
- $user = $_POST[ 'username' ];
- $user = stripslashes( $user );
- $user = mysql_real_escape_string( $user );
-
- // Sanitise password input
- $pass = $_POST[ 'password' ];
- $pass = stripslashes( $pass );
- $pass = mysql_real_escape_string( $pass );
- $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!
- //echo "<pre><br />This account has been locked due to too many incorrect logins.</pre>";
-
- // Calculate when the user would be allowed to login again
- $last_login = $row[ 'last_login' ];
- $last_login = strtotime( $last_login );
- $timeout = strtotime( "{$last_login} +{$lockout_time} minutes" );
- $timenow = strtotime( "now" );
-
- // Check to see if enough time has passed, if it hasn't locked the account
- if( $timenow > $timeout )
- $account_locked = true;
- }
-
- // 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
- echo "<p>Welcome to the password protected area <em>{$user}</em></p>";
- echo "<img src="{$avatar}" />";
-
- // Had the account been locked out since last login?
- if( $failed_login >= $total_failed_login ) {
- echo "<p><em>Warning</em>: Someone might of been brute forcing your account.</p>";
- echo "<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();
- }
- else {
- // Login failed
- sleep( rand( 2, 4 ) );
-
- // Give the user some feedback
- echo "<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();
-
- ?>
(编辑:成都站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|