За последние 24 часа нас посетили 62163 программиста и 1785 роботов. Сейчас ищут 787 программистов ...

Что я не понимаю в сессиях?

Тема в разделе "Прочие вопросы по PHP", создана пользователем darklight34, 12 апр 2015.

  1. darklight34

    darklight34 Новичок

    С нами с:
    12 апр 2015
    Сообщения:
    4
    Симпатии:
    0
    Здравствуйте!

    Есть две функции setToken и checkToken
    Если человек открывает страницу N то setFunction записывает в сессию токен и возвращает его значение для передачи в хтмл-форму

    Затем через форму делается аякс запрос к скрипту с функцией checkToken.

    Обе функции вызываются из общего тела скрипта в зависимости от переменных $_GET

    В итоге приходят разные переменные в сессии и в $_POST

    Код (PHP):
    1. function setToken(){
    2.         $token = sha1(substr(str_shuffle('qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'), 0, 10) . microtime());        
    3.         $_SESSION['tokenCSRF'] = $token;
    4.        return $token;
    5. }
    6.  
    7. function checkToken(){
    8.        if($_SESSION['tokenCSRF'] == $_POST['tokenCSRF']){
    9.             echo 'true';
    10.        }
    11. }
    12.  
    спасибо за внимание!
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    повторный вызов setToken() изменит значение в сессии. может быть в этом причина? более одного вызова перед проверкой.

    Добавлено спустя 7 минут 2 секунды:
    исходя из этих соображений, я бы сделал немного иначе:

    1) чтобы повторные вызовы в пределах одной сессии генерировали бы одинаковые токены.
    Код (PHP):
    1. $token = sha1($secret.SID); // сколько не вызывай, будет одинаковый (для одной сессии, т.е. пользователя)  
    или
    Код (PHP):
    1. $token = sha1($secret.SID.$_SERVER['REQUEST_TIME']); // одинаковый в пределах одного запроса  
    2) добавил бы параметр action чтобы в одной сессии могло быть несколько разных токенов для разных форм.
    Код (PHP):
    1. $_SESSION['tokenCSRF'.$action] = $token;
    и при проверке
    Код (PHP):
    1. if($_SESSION['tokenCSRF'.$action] == $_POST['tokenCSRF']){
     
  3. darklight34

    darklight34 Новичок

    С нами с:
    12 апр 2015
    Сообщения:
    4
    Симпатии:
    0
    Спасибо за ответ, насчёт повторной проверки - этот вариант сразу проверил

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

    2 за этот пункт отдельное спасибо))) как раз нужны разные токены для разных форм