2012-04-01 4 views
0

Я создаю систему входа в систему с php, и когда я отправляю правильную информацию, она устанавливает cookie. действие формы отправляется на ту же страницу, на которой установлена ​​проверка cookie isset, но поскольку куки-файлы нуждаются в обновлении после их установки, вам нужно обновить страницу в другой раз, чтобы заметить, что файлы cookie находятся там.php: настройка файлов cookie и их восстановление?

Какое обходное решение для этого? вот мой код (где имя пользователя и пароль «администратора» так же, как заполнитель. когда я получаю систему работать, я вытащу значения из базы данных.)

<?php 
if(isset($_COOKIE['user'])) 
{ 
echo "Hello, administrator.<br />"; 
echo "<a href=?logout=yes>logout</a>"; 
if(isset($_GET['logout'])) 
{ 
    setcookie("user", $_POST['username'], time() - 3600); 
} 
} 
else 
{ 
if (isset($_POST['submit'])) 
{ 
    if (($_POST['username']=="admin")&&($_POST['password']=="admin")) 
    { 
      setcookie("user", $_POST['username'], time() + 3600); 
    } 
    else 
    { 
     echo "empty field or wrong user/pass."; 
    } 
} 
else 
{ 
    echo "nothing submitted. show form."; 
} 
} 
?> 
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> 
<table border="0"> 
<tr><td colspan=2><h1>Login</h1></td></tr> 
<tr><td>Username:</td><td> 
<input type="text" name="username" maxlength="40"> 
</td></tr> 
<tr><td>Password:</td><td> 
<input type="password" name="password" maxlength="50"> 
</td></tr> 
<tr><td colspan="2" align="right"> 
<input type="submit" name="submit" value="Login"> 
</td></tr> 
</table> 
</form> 
+1

Вы понимаете, что каждый является потенциальным администратором с таким подходом? Любой пользователь может установить cookie с именем 'user' в своем клиенте. –

+0

Ферхад, какой метод вы предлагаете? Мне интересно. – David

+0

Используйте сеанс для всех пользовательских данных и файлов cookie для хранения идентификатора сеанса или хэша. –

ответ

0
$loggedin = false; 
if(isset($_POST['submit'])) { 
// Do login checking and set cookies 
$loggedin = true; // if the case 
}else if(isset($_COOKIE['username']) && isset($_COOKIE['password'])) { 
    // Check if valid login 
    $loggedin = true; // if the case 
}else{ 
    // They are not logged in. 
} 

Затем используйте veriable $ LoggedIn в Посмотрите, если они вошли в систему. Я предлагаю сделать класс пользователя, хотя для этого, так что вы продолжаете использовать один и тот же код снова и снова в своих файлах.

0

Вы можете сделать свою собственную функцию, чтобы установить печенье, то есть:

function my_setcookie($name,$value,$expire){ 
    $_COOKIE[$name] = $value; 
    return setcookie($name,$value,$expire); 
} 

Но лучше идея заключается в том, чтобы перенаправить пользователя после успешного выполнения запроса «POST», так что если страница обновляется, браузер не будет жаловаться пересылая данные POST.

1

Если вам абсолютно не нужно использовать настраиваемый файл cookie, я бы предложил вместо этого использовать $ _SESSION global. Данные $ _SESSION доступны сразу после его установки. Но его более важной особенностью является то, что данные не хранятся на клиенте. Это означает, что пользователь не может получить доступ к своим данным. Так что сложнее взломать систему входа в систему. С cookie, как указывали другие, любой может читать и редактировать данные!

session_start(); 

if (isset($_GET['logout'])) 
{ 
    unset($_SESSION['username']); 
} 
if ($_SESSION['username'] == 'admin') 
{ 
    echo "hello admin!"; 
} 
else if (($_POST['username']=="admin")&&($_POST['password']=="admin")) 
{ 
    $_SESSION['username'] = $_POST['username']; 
} 

Чтобы использовать $ _SESSION глобалам, вам нужно поставить session_start() в начале вашего скрипта (перед отправкой каких-либо данных). Он должен одновременно решить вашу проблему перенаправления. Обратите внимание, что за сценой $ _SESSION используется небольшой файл cookie, но вам не нужно об этом думать. Он содержит только небольшой идентификатор. более

информация о сессии

http://www.php.net/manual/en/book.session.php

PS: честно говоря, я бы до сих пор используют редирект здесь. Когда вы отправляете форму и нажимаете кнопку «Назад», браузер попросит вас отправить данные снова и досаждать. Используя перенаправление с header("Location: " . $newUrl);, удалите это раздражение. Но только мои 2 цента.

Смежные вопросы