Вход в PHP занимает две попытки для работы

У меня есть очень простой сценарий входа в систему, использующий сеансы PHP для ограничения доступа, но у меня действительно специфическая проблема. Вход всегда завершается с ошибкой с первой попытки, даже с правильными учетными данными, но вторая и последующие попытки работают без проблем. Я действительно смущен относительно причины, поэтому любая помощь будет оценена.

форма входа в систему с удаленным ненужным кодом (да, я знаю, что хранить данные для входа в файл PHP в виде обычного текста, как правило, плохая идея, но в данном случае это не имеет значения):

<?php

$username = $_POST['username'];
$password = $_POST['password'];

$valid_user = "user";
$valid_password = "password";


if (($_POST['op'] == "ds") && ($username == $valid_user) && ($password == $valid_password)) {
    session_start();
    session_register('valid');
    $_SESSION['valid'] = 'yes';
    header("Location: valid.php");
}

?>

<p>Username:<br>
<input type="text" name="username" size=15 maxlength=25></p>
<p>Password:</strong><br>
<input type="password" name="password" size=15 maxlength=25></p>
<input type="hidden" name="op" value="ds">
<p><input type="submit" name="submit" value="login"></p>

и каждая страница, которая нуждается в аутентификации, имеет

require "auth.php"

авторизация.php:

<?php

session_start();

if($_SESSION['valid'] != 'yes') {
    header("Location: login.php");
}

?>

person sslepian    schedule 19.09.2010    source источник
comment
Не используйте session_register('valid');. Это только говорит php поместить значение $valid в $_SESSION['valid'], но вы все равно делаете это вручную (это также должно быть сделано).   -  person poke    schedule 19.09.2010


Ответы (1)


Попробуйте die() после

header("Location: valid.php");

может случиться так, что это будет проигнорировано, потому что вы сразу же выводите форму входа в браузер.

Кроме того, die() обязателен после

header("Расположение: login.php");

если ваш скрипт выводит что-либо после него. В противном случае запрашивающий клиент может получить конфиденциальную информацию, даже если он не вошел в систему.

person Pekka    schedule 19.09.2010
comment
К сожалению, ни одно из этих исправлений не работает. Похоже, проблема в том, что переменная $_SESSION['valid'] не может быть правильно установлена, потому что, если я удалю заголовок (Location: login.php) и попытаюсь повторить $valid, он выведет пустую строку. - person sslepian; 19.09.2010
comment
@sslepian, можете ли вы поместить session_start в раздел заголовка всех скриптов? - person Pekka; 19.09.2010
comment
По-видимому, перемещение session_start из оператора if в верхнюю часть формы входа решило проблему. Спасибо! - person sslepian; 19.09.2010