За последние 24 часа нас посетили 35539 программистов и 1819 роботов. Сейчас ищут 818 программистов ...

Cookie. Не видит.

Тема в разделе "PHP для новичков", создана пользователем Arhitec, 4 сен 2018.

  1. Arhitec

    Arhitec Новичок

    С нами с:
    13 июл 2016
    Сообщения:
    43
    Симпатии:
    1
    Доброго всем вечера!
    Ранее не пользовался куками. Решил освоить эту тему.
    И столкнулся с тем, что в браузере куки видны, а на странице они не выводятся.
    Про то, что объявлять куки нужно до любого вывода я в курсе.

    Сложность в конструкции кода.
    Сценарий:
    1. На странице html-форма (авторизация). После ввода данных информация отправляется через Ajax в php-файл.
    2. На стороне сервера идет установка кукисов.
    3. После всех проверок JS перенаправит пользователя на php-страницу с проверкой кукисов.
    Вот как раз на этой странице куки не видны.
    Может ли это быть потому, что куки ставятся после прохождения Ajax запроса? Не вижу тут никакой связи, но вероятнее всего я просто чего-то не знаю или не понимаю.

    Код php обработчика, где ставлю куки:

    PHP:
    1. // Присоединяем файл конфигурации
    2. require ($_SERVER['DOCUMENT_ROOT'].'/aw-config.php');
    3.  
    4. // Подключаем AW-PHP библиотеку
    5. require ($_SERVER['DOCUMENT_ROOT'].'/'.AW_ENGINE_FOLDER.'/'.AW_FUN_FOLDER.'/'.AW_FUNPHP_FILE);
    6.  
    7. // Принимаем данные из формы
    8. $user_login = $_POST['login'];
    9. $user_pass = $_POST['pass'];
    10. $rememberme = $_POST['rememberme'];
    11.  
    12. // Обнуляем все ошибки
    13. $error_login = '';
    14. $error_pass = '';
    15. $error_connectDB = '';
    16.  
    17. // Подключаемся к MYSQL
    18. $connectDB = connectDB ( AW_MYSQLDB_PATCH );
    19. if($connectDB){$error_connectDB = '';} else {$error_connectDB = '<p class="error"><strong>Ошибка:</strong> Произошла внутренняя ошибка системы. Обратитесь к Администратору.</p>';}
    20.  
    21. // Проверяем на валидность введенные данные
    22. if($user_login == '' OR strlen($user_login) <= 0)
    23. {
    24.     $error_login = '<p class="atention"><strong>Внимание!</strong> Не заполнено поле &laquo;Имя пользователя или e-mail&raquo;</p>';
    25. }
    26. if($user_pass == '' OR strlen($user_pass) <= 0)
    27. {
    28.     $error_pass = '<p class="atention"><strong>Внимание!</strong> Не заполнено поле &laquo;Пароль&raquo;</p>';
    29. }
    30.  
    31. // Конвертируем пароль в MD5 дважды
    32. $user_pass = md5(MD5($user_pass));
    33.  
    34.  
    35. // Ищем пару логин и пароль в базе
    36. $sqlAuth = mysql_query("SELECT * FROM ".AW_MYSQL_PREFIX.AW_MYSQL_USERS." WHERE user_login = '".$_POST['login']."' LIMIT 1");
    37. $recAuth = mysql_fetch_array($sqlAuth);
    38. // Сравниваем введенный пароль с тем, что записан в базе
    39. if($recAuth['user_pass'] == $user_pass)
    40. {
    41.     // $noerror = '<p class="ok"><strong>OK!</strong> Логин найден. Пароли совпали.</p>';
    42.    
    43.     // Генерируем Хэш-код из случайных символов
    44.     $hash = RandomString(20,'lower, numbers');
    45.    
    46.     // Записываем в БД новый хеш авторизации
    47.     $sql_Auth = mysql_query("UPDATE ".AW_MYSQL_PREFIX.AW_MYSQL_USERMETA." SET meta_value = '$hash' WHERE user_id = '".$recAuth['id']."' AND meta_name = 'hash_code'");
    48.    
    49.     // Устанавливаем куки
    50.     $userid = $recAuth['id'];
    51.     setcookie("userid", $userid, time()+60*60*24);
    52.     setcookie("userhash", $hash, time()+60*60*24);
    53.    
    54.     $noerror = "Все прошло успешно! / ";
    55. }
    56. else
    57. {
    58.     $error_pass = '<p class="error"><strong>Ошибка:</strong> Не верный пароль.</p>';
    59. }
    60.  
    61. // Закрываем базу MYSQL
    62. disConnectDB($connectDB);
    63.  
    64. // Заполняем массив данных для отправки ответа
    65. $data = array
    66. (
    67.     'error_login' => $error_login,
    68.     'error_pass' => $error_pass,
    69.     'error_connectDB' => $error_connectDB,
    70.     'noerror' => $noerror
    71. );
    72.  
    73. // Отправляем ответ в формате JSON
    74. header("Content-type: application/json; charset=utf-8");
    75. echo json_encode($data);
    Страница, на которой вывожу куки:
    PHP:
    1. echo 'id: '.$_COOKIE['userid'].' / hash: '.$_COOKIE['userhash'];
    Чтобы убедиться создаются ли куки я в браузере удаляю ранее созданные.
    После запуска все работает как часы - куки браузер снова видит, а скрипт нет :(

    Попробовал создать отдельную страницу, на ней установил куки и прочел - все работает. Выходит что причина в моем коде, приведенном выше.
    Прошу помочь.
     
  2. yanuzay

    yanuzay Активный пользователь

    С нами с:
    28 мар 2018
    Сообщения:
    503
    Симпатии:
    58
    а если path дописать:
    Код (Text):
    1. setcookie("userid", $userid, time()+60*60*24, "/");
    2. setcookie("userhash", $hash, time()+60*60*24, "/");
     
    Arhitec нравится это.
  3. Arhitec

    Arhitec Новичок

    С нами с:
    13 июл 2016
    Сообщения:
    43
    Симпатии:
    1
    Кстати, что значит слэш? Корневая папка или что?
    Сейчас опробую.
     
  4. yanuzay

    yanuzay Активный пользователь

    С нами с:
    28 мар 2018
    Сообщения:
    503
    Симпатии:
    58
    типа того. назначаешь куки на весь домен.
     
    Arhitec нравится это.
  5. Arhitec

    Arhitec Новичок

    С нами с:
    13 июл 2016
    Сообщения:
    43
    Симпатии:
    1
    Друг мой, я очень тебе благодарен за помощь :) Все заработало!
    А то я тут такой велосипед накручивать начал, что страшно признаться в этом изврате :)))))
    --- Добавлено ---
    Правильно я понимаю, что если куки установлен в одну папку, а пытаешься вызвать в другом месте, то кукис не будет виден? Или ему нужно указать откуда его читать?
     
  6. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    1 инъекция
    2 пароль можно и нужно сравнивать средствами СУРБД
    3 password_hash
     
    Arhitec нравится это.
  7. Arhitec

    Arhitec Новичок

    С нами с:
    13 июл 2016
    Сообщения:
    43
    Симпатии:
    1
    Так и делаю. Куки мне нужны для проверки авторизации, пароль храню только в БД. Или я допустил ошибку в коде?
     
  8. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    это чистейшей воды инъекция, данные от пользователя надо фильтровать и проводить валидацию
     
    Arhitec и yanuzay нравится это.
  9. yanuzay

    yanuzay Активный пользователь

    С нами с:
    28 мар 2018
    Сообщения:
    503
    Симпатии:
    58
    path=PATH - этот атрибут устанавливает подмножество документов, для которых действительно значение cookie. Например, указание "path=/win" приведет к тому, что значение cookie будет действительно для множества документов в директории /win/, в директории /wings/ и файлов в текущей директории с именами типа wind.html и windows.shtml. Для того, чтобы cookie отсылались при каждом запросе к серверу, необходимо указать корневой каталог сервера, например, "path=/".

    Если этот атрибут не указан, то значение cookie распространяется только на документы в той же директории, что и документ, в котором было установлено значение cookie.
     
    Arhitec нравится это.
  10. Arhitec

    Arhitec Новичок

    С нами с:
    13 июл 2016
    Сообщения:
    43
    Симпатии:
    1
    Все доступно и понятно, огромное спасибо!
     
  11. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    хех, старая моя башка, для password_verefy всё-таки надо доставать хеш пароля из базы
     
    Arhitec нравится это.
  12. Arhitec

    Arhitec Новичок

    С нами с:
    13 июл 2016
    Сообщения:
    43
    Симпатии:
    1
    Аааа. Я понял о чем речь. Спасибо большое. Буду исправлять код.
     
  13. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    @Valick, можно сравнивать хэши.
     
    Arhitec нравится это.
  14. Arhitec

    Arhitec Новичок

    С нами с:
    13 июл 2016
    Сообщения:
    43
    Симпатии:
    1
    я так и делаю. Пароль используется только один раз для сверки с его кодированным вариантом. А потом только id пользователя и его hash-код, который ничего общего с паролем или логином не имеет.
     
  15. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    @Arhitec, для начала можно делать валидацию по-простому. См. мою статью Как сделать авторизацию пользователя?

    PHP:
    1. $sqlAuth =
    2. $recAuth =
    3. if($recAuth['user_pass'] == $user_pass)
    Нужно делать проверки после каждого из присваиваний. И почитайте про сравнение строк, в частности тождественное сравнение.
     
    Arhitec нравится это.
  16. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @miketomlin, какие хеши? md5 да, но тут речь о password_hash и password_verefy
     
  17. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    Ту муть, что возвращается ф-цией password_hash.
     
  18. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    попробуй
     
  19. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    Нафига мне пробовать? Я «твою старую башку» спасаю, если ты не понял.
    --- Добавлено ---
    P.S. И твоя монетка реально глаза мозолит :)
     
  20. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    <?php
    echo password_hash('miketomlin', PASSWORD_DEFAULT);

    запусти и пообновляй станичку
    --- Добавлено ---
    это тест на человеческую жадность
     
  21. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    Про третий параметр слыхал? И недефолтное значение второго?

    А я думал, на щедрость :) Хотя мне побоку смысл. Раздражает глаза только размер.
     
  22. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Не только слышал, но в отличии от тебе еще и понимаю, почему не надо использовать этот вариант.
     
  23. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    @Valick, ОК, больше вас спасать не буду. Все равно ничего кроме хамства не дождешься.
     
  24. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @miketomlin, не надо мне делать одолжений, тем более при таких обстоятельствах где они совершенно не уместны, ты лучше позаботься о себе, и скажи спасибо, что наконец погуглил и разобрался, как работает password_hash. На счёт хамства... поверь я даже не начинал. Наоборот, я не хотел этого говорить, но видимо придётся. Надо быть полным идиотом, что бы отказаться от преимущества password_hash, и от проверки password_verefy, только ради того что бы не доставать хеш пароля из БД. Спрошу тебя твоими же словами, ты про "радужные таблицы" слышал?
     
  25. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    Естественно, слышал. Я даже «слышал», что эти функции придумали специально для тупаков, чтобы оторвать их от использования некриптостойких хэшей вроде md5. Вменяемым проггерами они нафиг не нужны. Тем более что в их реализации первоначально была допущена ошибка, кладущая большой болт на всю криптостойкость, ради которой они и создавались. Короче успехов в использовании этих ф-ций. Сейчас у них скорее всего уже нет никаких проблем. Конечно, если не считать идиотизм самого механизма их работы.