加入收藏 | 设为首页 | 会员中心 | 我要投稿 成都站长网 (https://www.028zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 评论 > 正文

浅谈PHP安全规范

发布时间:2018-10-14 12:35:28 所属栏目:评论 来源:littlepotato
导读:副标题#e# 【新品产上线啦】51CTO播客,随时随地,碎片化学习 一、前言 php因天生支持web应用的开发,以其简单易学,开发效率高而备受喜爱。使其占据了大片的市

(2) Impossible level

  1. <?php  
  2.  
  3. if( isset( $_POST[ 'Login' ] ) ) {  
  4.     // Check Anti-CSRF token  
  5.     checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );  
  6.  
  7.     // Sanitise username input  
  8.     $user = $_POST[ 'username' ];  
  9.     $user = stripslashes( $user );  
  10.     $user = mysql_real_escape_string( $user );  
  11.  
  12.     // Sanitise password input  
  13.     $pass = $_POST[ 'password' ];  
  14.     $pass = stripslashes( $pass );  
  15.     $pass = mysql_real_escape_string( $pass );  
  16.     $pass = md5( $pass );  
  17.  
  18.     // Default values  
  19.     $total_failed_login = 3;  
  20.     $lockout_time       = 15;  
  21.     $account_locked     = false;  
  22.  
  23.     // Check the database (Check user information)  
  24.     $data = $db->prepare( 'SELECT failed_login, last_login FROM users WHERE user = (:user) LIMIT 1;' );  
  25.     $data->bindParam( ':user', $user, PDO::PARAM_STR );  
  26.     $data->execute();  
  27.     $row = $data->fetch();  
  28.  
  29.     // Check to see if the user has been locked out.  
  30.     if( ( $data->rowCount() == 1 ) && ( $row[ 'failed_login' ] >= $total_failed_login ) )  {  
  31.         // User locked out.  Note, using this method would allow for user enumeration!  
  32.         //echo "<pre><br />This account has been locked due to too many incorrect logins.</pre>";  
  33.  
  34.         // Calculate when the user would be allowed to login again  
  35.         $last_login = $row[ 'last_login' ];  
  36.         $last_login = strtotime( $last_login );  
  37.         $timeout    = strtotime( "{$last_login} +{$lockout_time} minutes" );  
  38.         $timenow    = strtotime( "now" );  
  39.  
  40.         // Check to see if enough time has passed, if it hasn't locked the account  
  41.         if( $timenow > $timeout )  
  42.             $account_locked = true;  
  43.     }  
  44.  
  45.     // Check the database (if username matches the password)  
  46.     $data = $db->prepare( 'SELECT * FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' );  
  47.     $data->bindParam( ':user', $user, PDO::PARAM_STR);  
  48.     $data->bindParam( ':password', $pass, PDO::PARAM_STR );  
  49.     $data->execute();  
  50.     $row = $data->fetch();  
  51.  
  52.     // If its a valid login...  
  53.     if( ( $data->rowCount() == 1 ) && ( $account_locked == false ) ) {  
  54.         // Get users details  
  55.         $avatar       = $row[ 'avatar' ];  
  56.         $failed_login = $row[ 'failed_login' ];  
  57.         $last_login   = $row[ 'last_login' ];  
  58.  
  59.         // Login successful  
  60.         echo "<p>Welcome to the password protected area <em>{$user}</em></p>";  
  61.         echo "<img src="{$avatar}" />";  
  62.  
  63.         // Had the account been locked out since last login?  
  64.         if( $failed_login >= $total_failed_login ) {  
  65.             echo "<p><em>Warning</em>: Someone might of been brute forcing your account.</p>";  
  66.             echo "<p>Number of login attempts: <em>{$failed_login}</em>.<br />Last login attempt was at: <em>${last_login}</em>.</p>";  
  67.         }  
  68.  
  69.         // Reset bad login count  
  70.         $data = $db->prepare( 'UPDATE users SET failed_login = "0" WHERE user = (:user) LIMIT 1;' );  
  71.         $data->bindParam( ':user', $user, PDO::PARAM_STR );  
  72.         $data->execute();  
  73.     }  
  74.     else {  
  75.         // Login failed  
  76.         sleep( rand( 2, 4 ) );  
  77.  
  78.         // Give the user some feedback  
  79.         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>";  
  80.  
  81.         // Update bad login count  
  82.         $data = $db->prepare( 'UPDATE users SET failed_login = (failed_login + 1) WHERE user = (:user) LIMIT 1;' );  
  83.         $data->bindParam( ':user', $user, PDO::PARAM_STR );  
  84.         $data->execute();  
  85.     }  
  86.  
  87.     // Set the last login time  
  88.     $data = $db->prepare( 'UPDATE users SET last_login = now() WHERE user = (:user) LIMIT 1;' );  
  89.     $data->bindParam( ':user', $user, PDO::PARAM_STR );  
  90.     $data->execute();  
  91. }  
  92.  
  93. // Generate Anti-CSRF token  
  94. generateSessionToken();  
  95.  
  96. ?> 

(编辑:成都站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读