Странное поведение PHP сессии - PullRequest
0 голосов
/ 13 августа 2011

Меня озадачивает странное поведение некоторых переменных сеанса.В частности, переменная "token".

Вот как я ее создаю в index.php :

<?php
session_start();
$_SESSION['token'] = sha1(rand(7451, 98632)); // Lets name it "something"
?>

Затем я выполняю POST с AJAX и передаю егопеременная другого скрипта, ajax_io.php :

Внутри ajax_io.php :

<?php
session_start();
if($_POST['token'] != $_SESSION['token']) die('Horribly');
?>

Моя проверка всегда «умирает»,в то время как токен передается должным образом сообщением javascript AJAX в index.php, $ _SESSION ['token'] в ajax_io.php отличается от того, который создан в index.php.

, например, в ajax_io.php:

The $_POST['token'] appears as "something"
but,
$_SESSION['token'] appears as "something else"

Это похоже на то, что пост AJAX запрашивает index.php (каким-то образом), который создает другой токен, а затем запрашивает ajax_io.php для выполнения запрошенной функциональности.

Вот AJAX-запрос Javascript:

var token = '<?php echo $the_token; ?>';    
$.post("ajax_io.php", {
        token: token
    }, function(data) {
        // Do something with data
    });

UPDATE :

Я не упомянул, что в реальном скрипте есть цикл foreach и этот циклявляется причиной проблемы.Каким-то образом он переписывает переменную токена php, сгенерированную в каждом цикле, но скрипт сохраняет исходное значение для установки переменной javascript.

$the_token = sha1(mt_rand(10, 100));
$_SESSION['tokens'][] = $the_token; // Notice the multidimensional array here

foreach(somethin) :
// do something other than setting any session variable
endforeach;
print_r( $_SESSION );

Вывод:

Array (
[tokens] => array (
[0] => b19477cb038d6e0f588b6631c1686c8e246b82d5 // The real one created at the beginning of the script
[1] => 51e57c94bfd5c81b11e8c48dc8002b1162f4cd84
[2] => 084c881c074678218a4394524f60d3867da84cb3
)
)

На этомСценарий, если я выведу $ _SESSION, я получу N токенов, например 3. Но только первый - тот, который физически создан моим сценарием, а два других - циклом.Я прошел весь сценарий цикла, но не нашел ничего, что устанавливало бы какие-либо переменные для СЕССИИ.

Ответы [ 4 ]

0 голосов
/ 16 августа 2011

Обнаружено, что причиной двойного запроса был тег IMG на отображаемом тексте внутри цикла foreach. У тега был пустой параметр src, который вызывал запрос в фоновом режиме. Этот запрос обновлял сгенерированный ключ, но, поскольку он был в фоновом режиме, передняя часть не получала новый ключ. Глупая проблема.

Этот вопрос в настоящее время решен. (Надеюсь)

0 голосов
/ 14 августа 2011

Попробуйте изменить .post на .ajax как синхронный и сообщите нам, что происходит.Пожалуйста, опубликуйте версию сценария без кода, поскольку то, что вы опубликовали, работает нормально, и проблема, вероятно, в деталях логики где-то еще.

0 голосов
/ 14 августа 2011

Я не могу вычеркнуть так много из скрипта, чтобы опубликовать код, логика такая же, как и в исходном сообщении, с циклом WHILE, содержащим примерно на 50-60 строк больше кода.

Я только что нашел больше. Похоже, что браузеры запрашивают файл index.php более одного раза.

127.0.0.1 - - [14 / Aug / 2011: 19: 38: 40 +0300] "GET /cmdownloads/index.php?itsme=petsoukos HTTP / 1.1" 200 11919 127.0.0.1 - - [14 / Aug / 2011: 19: 38: 40 +0300] "GET /cmdownloads/js/jquery-1.6.1.min.js HTTP / 1.1" 304 - 127.0.0.1 - - [14 / Aug / 2011: 19: 38: 40 +0300] "GET /cmdownloads/js/jquery-ui-1.8.13.custom.min.js HTTP / 1.1" 304 - 127.0.0.1 - - [14 / Aug / 2011: 19: 38: 40 +0300] "GET /cmdownloads/css/style.css HTTP / 1.1" 304 - 127.0.0.1 - - [14 / Aug / 2011: 19: 38: 40 +0300] "GET /cmdownloads/js/script.js HTTP / 1.1" 304 - 127.0.0.1 - - [14 / Aug / 2011: 19: 38: 40 +0300] "GET /cmdownloads/img/overlay.png HTTP / 1.1" 304 - 127.0.0.1 - - [14 / Aug / 2011: 19: 38: 40 +0300] "GET /cmdownloads/index.php?itsme=petsoukos HTTP / 1.1" 200 11980 127.0.0.1 - - [14 / Aug / 2011: 19: 38: 40 +0300] "GET /favicon.ico HTTP / 1.1" 404 209

Один пользователь обновляет страницу, а другой ...? Не могу найти источник этого запроса.

0 голосов
/ 14 августа 2011

У вас просто плохая логика.Не каждый раз проверяйте токен.Когда вы делаете это, оно перезаписывает это.Просто генерируйте его по необходимости, а не каждый раз.

$_SESSION['token'] = (empty($_SESSION['token'])) ? gen_new_token() : $_SESSION['token'];

Вы можете хранить время, для которого оно действительно и т.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...