У меня есть скрипт для входа в 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.';
}
}
}
?>
[Ваш скрипт подвержен риску внедрения SQL.] (Http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php). Вы должны [использовать правильные методы для хэш-паролей с PHP] (http://jayblanchard.net/proper_password_hashing_with_PHP.html). –
Вы печатаете что-то перед перенаправлением? если заголовки уже отправлены, вы не можете перенаправить – oscargilfc
@JayBlanchard OP избегает всех значений в запросе. Да, они должны использовать параметры привязки, но это не уязвимо, как написано. –