2015-06-10 13 views
-2

У меня есть скрипт для входа в PHP, который ДОЛЖЕН принимать введенное имя пользователя & пароль, проверяя его на значение в MySQL (с паролем, зашифрованным через SHA1), а затем перенаправляя пользователя на «dash.php», если логин успешно завершен или печатает ошибку, если нет. Однако всякий раз, когда я отправляю форму, она просто перезагружает login.php ... Я где-то делал глупую ошибку или что-то не хватает? Извините за огромный пост!Misbehaving Login Script

login.php (содержащий форма):

//Form Action 
<?php 

error_reporting(E_ALL); 
ini_set('display_errors','1'); 

if ($_SERVER['REQUEST_METHOD'] == 'POST') { 

    require ('scripts/mysqli_connect.php'); 

    require ('scripts/login_functions.php'); 


    list ($check, $data) = check_login($dbc, $_POST['username'], $_POST['password']); 

    if($check) { 

     redirect_user('dash.php'); 
    } else { 
     $errors = $data; 
    } 

    mysqli_close($dbc); 
} 

?> 

// Website HTML 

//Form 
<form class="contact-form" method="post" action="login.php"> 
        <div class="col-sm-5 col-sm-offset-1"> 
         <div class="form-group"> 
          <label>Username: </label> 
          <input type="text" name="username" id="username" size="15" class="form-control" required="required" placeholder="username"> 
         </div> 
         <div class="form-group"> 
          <label>Password: </label> 
          <input type="password" name="password" id="password" size="15" class="form-control" required="required" placeholder="password"> 
         </div>       
         <div class="form-group"> 
          <input type="submit" name="submit" value="Login" /> 
         </div> 
        </div> 
       </form> 

login_functions.php:

<?php 

function redirect_user ($page = '../login.php') { 
    $url = "http://" . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']); 

    $url = rtrim($url, '/\\'); 

    $url .= '/' . $page; 

    //Redirect User 

    header("Location: $url"); 
    exit(); //Quit the script. 

} 


function check_login($dbc, $username = '', $password = '') { 
    $errors = array(); 

    if(empty($username)) { 
     $errors[] = 'You forgot to enter your username.'; 
    } else { 
     $u = mysqli_real_escape_string($dbc, trim($username)); 
    } 

    if(empty($password)) { 
     $errors[] = 'you forgot to enter your passord.'; 
    } else { 
     $p = mysqli_real_escape_string($dbc, trim($password)); 
    } 

    if (empty($errors)) { 

     $q = "SELECT username, password FROM users WHERE username='$u' AND password=sha1('$p')"; 
     $r = @mysqli_query ($dbc, $q); 


     //Check Results 

     if(mysqli_num_rows($r) == 1) { 

      $row = mysqli_fetch_array ($r, MYSQLI_ASSOC); 

      return array(true, $row); 
     } else { 
      $errors[] = 'The username/password combination is incorrect.'; 
     } 
    } 

} 


?> 
+2

[Ваш скрипт подвержен риску внедрения SQL.] (Http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php). Вы должны [использовать правильные методы для хэш-паролей с PHP] (http://jayblanchard.net/proper_password_hashing_with_PHP.html). –

+0

Вы печатаете что-то перед перенаправлением? если заголовки уже отправлены, вы не можете перенаправить – oscargilfc

+0

@JayBlanchard OP избегает всех значений в запросе. Да, они должны использовать параметры привязки, но это не уязвимо, как написано. –

ответ

1

Вы не возвращаете вас ошибки:

return array(true, $row); 
} else { 
    $errors[] = 'The username/password combination is incorrect.'; 
    $return array(false, $errors); 
} 

И вы не отображает ошибки:

// Website HTML 

<?php if ($errors):?>  
    <?php echo '<p>' . implode('</p><p>', $errors) . '<p>';?> 
<?php endif;?> 
//Form 
<form class="contact-form" method="post" action="login.php"> 
+0

Полезное примечание от Стива. сначала проверьте наличие ошибок. Вы можете перейти к своим инструментам разработчика в своем браузере, щелкнуть раздел «Сеть», где вы сможете увидеть ваши звонки и данные ответа. –