2013-04-29 3 views
0

У меня проблема, и я не могу найти решение. Проблема в том, что когда пользователь открывает страницу, маркер безопасности генерируется, как это и добавил к сеансу массивуКак удалить неиспользуемые токены безопасности из массива

$token = generate_csrf_token(); 
$_SESSION['tokens'][] = $token; 

я использую это $ фишку в представлении формы как скрытый вход для CSRF безопасности. Теперь проблема, если пользователь Сообщение комментариев можно удалить $ фишку из массива после комментария быть размещены как этот

$token = $_POST['token']; 

// comment posting process 

$key = array_search($token, $_SESSION['tokens']); 
unset($_SESSION['tokens'][$key]); 

Но если пользователь не оставлять каких-либо комментариев и бросить страницу, Как я Можно удалить этот $ токен из массива $_SESSION['tokens'][]. Если я не удалю, это может вызвать так много неиспользуемых $ токенов в массиве.

+1

Когда вы убиваете сеанс? – Hemc

ответ

1

В обычной ситуации, когда пользователь покидает страницу, его cookie, ссылающийся на сеанс, будет очищен. (когда он закрывает свой браузер). В следующий раз, когда он откроет браузер и посещает вашу страницу, он начнет новый сеанс.

Теперь, поскольку он потерял ссылку на вашу сессию, и никто другой ее не использует, файл сеанса больше не будет доступен, и как только он не получит доступ в течение определенного времени, сборщик мусора очистит его.

Так что вам не нужно беспокоиться о «Очищении маркеров безопасности», когда пользователь покидает страницу. Это автоматически позаботится. Если, конечно, вы сами ввернули управление сеансом. См. Информацию session settings для параметров, которые вы можете изменить.

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

Первым будет использование одного токена безопасности для каждого сеанса. Если пользователь закрывает страницу (читает: загружает другую страницу на вашем сайте), то он будет выпускать новый токен в $_SESSION['token'] (без массива), а старый будет очищен. Для этого необходимо проверить токен после POST, прежде чем вы его измените.

Другой вариант состоит только в том, чтобы использовать последние 5 или около того жетонов. Затем вы можете держать его в чистоте, не требуя изменения чека на токены. Вы можете использовать array_shift сделать это

<? 
$tokens[] = 'new token'; 
if (count($tokens)>5) { 
    array_shift($tokens); //first is removed, so the last 5 remain 
} 
?> 

Последний способ, которым я могу думать о том, чтобы добавить время к маркеру и по запросу страницы, корыто петли токенов и проверить время. Если в прошлом время больше хх минут, удалите его.

1

Как и в любом асинхронном состоянии клиент-сервер, ответ таймауты. Вы не можете гарантировать, что токен будет использоваться, и даже если он в конечном итоге используется, вы не можете знать, когда. Также нет явного механизма обратной связи для неиспользуемых токенов; неиспользуемые токены просто никогда не используются.

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

// run garbage collection roughly every 100 page loads 
if (mt_rand(0, 100) == 0) { 
    foreach ($_SESSION['tokens'] as $i => $token) { 
     if ($token['timestamp'] < time() - 3600) { 
      unset($_SESSION['tokens'][$i]); 
     } 
    } 
} 

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

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