2013-08-08 2 views
1

Я начинающий программист PHP, и я не могу установить файлы cookie.PHP - Невозможно создать файлы cookie

Я получаю эту ошибку:

Notice: Undefined index: user in D:\XAMPP\htdocs\Bank\verify.php on line 28

Notice: Undefined index: pass in D:\XAMPP\htdocs\Bank\verify.php on line 28

В коде, я просто установив печенье с значением $_POST['user'] и $_POST['pass'] от формы и печать, но это не будет работать.

setcookie("user",$_POST['user'],3600); 
setcookie("pass",$_POST['pass'],3600); 
echo $_COOKIE["user"] . " " . $_COOKIE["pass"]; // This is line 28 

И вот моя форма:

<form action="verify.php" method="post"> 
    Username: <input name="user" /><br /> 
    Password: <input name="pass" type="password" /><br /> 
    <input type="submit" value="Submit" /> 
</form> 

Кто-нибудь знает, почему это происходит? Пожалуйста помоги.

Спасибо.

+0

, пожалуйста, покажите свою форму. –

ответ

1

Файлы cookie используются при следующем посещении страницы. Итак, есть 3 общих решения: 1. Сохраните его в файл cookie и в первый раз, просто замените POST-переменные вместо COOKIE.Код будет выглядеть следующим образом:

setcookie('user', $_POST['user'], time()+3600); // notice time() function 
setcookie('pass', $_POST['pass'], time()+3600); // you cant use absolute value here 

if (!isset($_COOKIE['user'])) echo $_POST['user'] . ' ' . $_POST['pass']; 
    else echo $_COOKIE['user'] . ' ' . $_COOKIE['pass']; 

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

setcookie('pass', hash(whirlpool/*algorithm*/, $_POST['pass']/*text*/), time()+3600); 

, то при проверке пароля, просто хэш его и сравнить хэши.


2. Решение - это сеанс, но он будет работать только до тех пор, пока вы не закроете свой браузер, а затем весь сеанс будет удален.
3. и, вероятно, лучшим решением является сохранение пароля пользователя + в базе данных mySQL или в формате .txt на стороне сервера. Тем не менее, не забудьте сделать хэш, потому что даже в базе данных кто-то может украсть эту информацию, используя некоторые хаки. Даже если вы думаете, что ваша сеть в безопасности - лучше безопасно, чем сожалеть.
Это к вашему решению. Простое примечание. Если вы хотите хранить пароли на что-либо важное, всегда хеш-файл, предварительно используйте соленый хеш. Попробуйте Google, есть много статей о хешировании в Интернете. Посмотрите на этом сайте: http://php.net/manual/en/faq.passwords.php

0
setcookie(); 

говорит PHP, чтобы отправить кук в браузер в следующий раз он посылает ответ браузера

$_COOKIE 

этого печенье, которые были , полученным от браузера, когда браузер отправлено запрос на PHP

Вы пытаетесь установить и принять в то же самое запрос

EDIT

PS Я понимаю, что вы только учитесь, но я надеюсь, что вы не планируете хранить идентификатор пользователя и пароль в печенье, где каждый в интернете может увидеть их

+0

Это не так, что все в Интернете могут видеть их (при условии, что это логин, клиент должен отправить их на сервер в любом случае, поэтому только HTTPS может помочь). Большая проблема заключается в том, что файлы cookie видны всем, у кого есть доступ к файловой системе клиента, даже если само соединение было защищено. – brianmearns

+0

Но при обычном входе, идентификатор пользователя и пароль отправляются только один раз с запросом на вход: файлы cookie отправляются с запросом __every__ в этот домен –

+0

Это правда, это * усугубляет * проблему, но если вы не используете безопасное соединение чтобы отправить пароль, даже один раз, вы в значительной степени завинчиваете своих пользователей. – brianmearns

0

$_COOKIE только для файлов cookie, которые были переданы в запросе (от веб-клиента) к скрипту, а не файлы cookie, которые вы установили в скрипте для отправки клиенту. Таким образом, «пользователь» и «пропуск» не будут находиться в $_COOKIE до после, вы отправляете их клиенту и клиент отправляет их обратно.

Кроме того, пожалуйста скажите мне, что вы не установки пароля в куки? Это очень плохая защита, поскольку файлы cookie не удалены. Обычной методикой является создание сеанса PHP, который хранит данные только на веб-сервере, а затем просто помещает идентификатор сеанса в файл cookie. Информацию о сеансах в PHP см. В разделе the php online manual.

+0

хорошая идея. лучше использовать сеанс вместо этого. –

+0

Обратите внимание, что сеансы по-прежнему уязвимы для * захвата сеанса *. Другими словами, если вы не используете безопасное соединение, то даже идентификатор сеанса, отправленный в cookie, видится злоумышленникам: они могут просто генерировать свой собственный запрос, который отправляет один и тот же идентификатор сеанса, и вдруг они записываются в журнал в сеанс пользователя. Лучший способ обойти это безопасное соединение, но есть другие вещи, которые вы можете сделать, чтобы сделать его более безопасным, например, изменить идентификатор сеанса на каждый ответ. – brianmearns

0

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

if(isset($_POST['user']) && isset($_POST['pass'])){ 

setcookie("user",$_POST['user'],3600); 
setcookie("pass",$_POST['pass'],3600); 

header("location:".$_SERVER['PHP_SELF']); 

} 
if(isset($_COOKIE['user']) && isset($_COOKIE['user'])) 
{ 
echo $_COOKIE["user"] . " " . $_COOKIE["pass"]; // This is line 28 

} 

Однако целесообразно использовать сеансы вместо этого. Просмотр вакансий PHP_SESSION

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