Я пишу PHP-код, где я хочу сам передать идентификатор сеанса, используя POST. Я не хочу, чтобы cookie хранил сеанс, так как он должен потеряться, когда пользователь выходит из цикла POST.
PHP автоматически устанавливает cookie, где он доступен. Я узнал, что можно изменить это поведение, установив session.use_cookies
на 0 в php.ini
. К сожалению, у меня нет доступа к этому файлу, и я также не хочу нарушать поведение других скриптов, работающих на одном сервере.
Есть ли способ отключить или аннулировать cookie сессии внутри PHP-скрипта?
EDIT: поскольку предлагаемые решения не работают для меня, я использовал $ _SESSION = array () в позициях в коде, где я обнаружил, что сеанс должен быть недействительным.
err его можно переопределить по умолчанию настройки вашего хоста, создав свой собственный .htaccess файл, и вот отличный учебник, если вы не тронули это еще http://www.askapache.com/htaccess/apache-htaccess.html
или если вам слишком ленив, чтобы узнать, просто создайте файл «.htaccess» (да, это имя файла) в каталоге ваших сайтов и поместите следующий код
SetEnv session.use_cookies='0';
Используйте ini_set () :
ini_set('session.use_cookies', '0');
Или в файле php.ini:
session.use_cookies = 0
Вы также можете установить эту настройку в .htaccess, чтобы она применима ко всем сценариям, в противном случае вам нужно обеспечить, чтобы код вызывался при каждом запросе.
Например.
php_value session.use_cookies 0
Если вам просто нужно убрать сеанс в определенный момент времени, используйте session_destroy (). Если вы хотите полностью завершить сеанс, вот фрагмент копий / вставленный прямо из документации:
// Initialize the session. // If you are using session_name("something"), don't forget it now! session_start(); // Unset all of the session variables. $_SESSION = array(); // If it's desired to kill the session, also delete the session cookie. // Note: This will destroy the session, and not just the session data! if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time()-42000, '/'); } // Finally, destroy the session. session_destroy();
У меня возникли проблемы с документированным подходом PHP к уничтожению сеанса с помощью файлов cookie.
// If it's desired to kill the session, also delete the session cookie. // Note: This will destroy the session, and not just the session data! if (ini_get("session.use_cookies")) { $params = session_get_cookie_params(); setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"] ); }
Это привело к тому, что я увидел, что файл cookie установлен дважды:
Set-Cookie: SESSION_NAME=deleted; expires=Sat, 08-Jan-2011 14:09:10 GMT; path=/; secure Set-Cookie: SESSION_NAME=1_4f09a3871d483; path=/
Как указано в комментариях PHP, установка значения cookie для чего-то другого, кроме пустого (''), устраняет «удаленное» значение, но второй набор файлов cookie остался.
Чтобы избавиться от этого, мне пришлось добавить код, предложенный выше:
ini_set('session.use_cookies', '0');
Я не смотрел на источник обработки сеансов, но я предполагаю, что setcookie (…) обходит модуль сессий, поэтому сеансы не знают, что я его назвал. Таким образом, он устанавливает cookie по умолчанию после того, как я настроил удаленный файл cookie.
Я тестировал mac: PHP 5.3.6 с Suhosin-Patch (cli) (построено: 8 сентября 2011 19:34:00)
Способ сделать это – настроить сеансы самостоятельно.
В центральном файле include, в который включены все ваши другие файлы (у вас есть один из них, не так ли?), Вам нужно сделать несколько вещей уже практически.
if( !array_key_exists('sessionid', $_POST) ) { // recreate the sessionid $sessionid = md5(rand().' '.microtime()); // Or something } else { $sessionid = $_POST['sessionid']; session_id($sessionid); session_start();
Теперь вы должны помнить, что как только вы запустите форму, вам необходимо включить:
<input type='hidden' name='sessionid'><?= session_id() ?></input>