Php: setcookie – manual

Как уничтожить сессию

В этом разделе мы увидим, как можно уничтожить сессию. В предыдущем разделе мы рассмотрели функцию unset, которая используется для удаления определённых переменных сеанса.  С другой стороны, если вы хотите удалить сразу все данные, связанные с сеансом, вы можете использовать функцию session_destroy.

Попробуем понять, как это работает в следующем примере.

Функция session_destroy удаляет всё, что хранится в текущем сеансе. Таким образом, с последующими запросами вы увидите пустую переменную $_SESSION, поскольку данные сеанса, хранящиеся на диске, были удалены функцией session_destroy.

Как правило, функцию session_destroy нужно использовать, когда пользователь выходит из системы.

Php: ini-настройки безопасности сессий – manual

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

  • session.cookie_lifetime=0

    0 имеет особое значение. Он сообщает браузеру не сохранять
    cookie в постоянное хранилище. Следовательно, когда браузер закрывается,
    сессионные cookie сразу же удаляются. Если задать значение отличное
    от 0, это может позволить другим пользователям использовать эти cookie.
    В большинстве случаев лучше всего использовать “0“.

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

  • session.use_cookies=On

    session.use_only_cookies=On

    Несмотря на то, что HTTP-cookie имеют некоторые проблемы, всё же они
    наиболее предпочтительны для хранения идентификатора сессии. Когда это
    возможно, для управления идентификаторами сессий необходимо использовать
    “cookie”. Большинство приложений должны использовать cookie для идентификатора сессии.

    Если session.use_only_cookies=Off,
    модуль сессии будет использовать идентификатор, установленный
    через GET/POST/URL, если “cookie” не была выставлена заранее.

  • session.use_strict_mode=On

    Крайне рекомендуется включать
    session.use_strict_mode. По умолчанию не включено.

    Это не позволит сессионному модулю использовать неинициализированные
    идентификаторы сессий. Другими словами, сессионный модуль будет
    принимать только корректные идентификаторы, сгенерированные им же и
    будет игнорировать идентификаторы созданные на стороне пользователя.

    Из-за особенностей спецификации cookie, атакующий может сделать
    cookie с идентификатором сессии неудаляемой с помощью локальной
    базы cookie или JavaScript-инъекцией.
    session.use_strict_mode может не дать
    атакующему использовать этот идентификатор.

    Замечание:

    Атакующие могут инициализировать идентификатор сессии на своём устройстве
    и выставить его жертве. Они должны будут поддерживать сессию в активном
    состоянии для злоупотреблений. Атакующим понадобится совершить
    дополнительные действия для проведения атаки по этому сценарию.
    Поэтому session.use_strict_mode
    служит как предотвращение этому.

  • session.cookie_httponly=On

    Запрещает доступ к сессионной cookie для JavaScript. Эта опция
    предотвращает кражу cookie с помощью JavaScript-инъекции.

    Можно использовать сессионный ID как защитный ключ CSRF, но не рекомендуется.
    Например, HTML может быть сохранён и отправлен другому пользователю.
    Разработчик не должен записывать сессионный ID внутри страницы для повышения безопасности.
    Почти все приложения должны использовать атрибут httponly для сессионной cookie.

    Замечание:

    Защитный ключ CSRF должен периодически обновляться, как и идентификатор сессии.

  • session.cookie_secure=On

    Разрешает получать доступ к cookie идентификатора сессии только при использовании протокола HTTPS.
    Если ваш сайт использует только протокол HTTPS, вам необходимо включить эту опцию.

    Для таких сайтов нужно также рассматривать использование HSTS.

  • session.cookie_samesite=”Lax” или
    session.cookie_samesite=”Strict”

    Начиная с PHP 7.3, вы можете установить cookie-флаг "SameSite" для
    cookie идентификатора сессии. Этот флаг является способом смягчения атак CSRF (межсайтовая подделка запроса).

    Разница между Lax и Strict заключается в доступности cookie в запросах,
    исходящих из другого регистрируемого домена с использованием HTTP-метода GET.
    Cookie, использующие Lax, будут доступны в GET-запросе, исходящем из другого регистрируемого домена,
    тогда как cookie, использующие Strict, не будут.

  • session.gc_maxlifetime=[выбрать наименьший из возможных]

    session.gc_maxlifetime настройка для удаления устаревших
    идентификаторов сессий. Полагаться на эту опцию категорически
    не рекомендуется.
    Вы должны управлять жизненным циклом сессии самостоятельно.

    Сессионный сборщик мусора GC (garbage collection) лучше использовать с помощью session_gc().
    Функцию session_gc() лучше всего запускать через планировщик,
    например, cron на *nix-системах.

    По умолчанию GC работает на вероятностном принципе. Эта настройка
    не гарантирует удаление старых сессий. Разработчику не следует
    полагаться на эту настройку, но всё равно, рекомендуется выставить её
    минимально возможным значением. Настраивайте session.gc_probability
    и session.gc_divisor так,
    чтобы устаревшие сессии удалялись достаточно часто.
    Если требуется функциональность автологина, реализуйте его самостоятельно и
    никогда не используйте для этого долгоживущие сессии.

    Замечание:

    Некоторые обработчики сохранения сессий не используют
    механизм устаревания сессий на основе вероятностей.
    Например memcached, memcache. Читайте соответствующую
    документацию для более полной информации.

  • session.use_trans_sid=Off

    Использование прозрачного управления сессионным ID не рекомендуется.
    Вы можете использовать его, если необходимо. Однако, отключение прозрачного
    управления повышает безопасность сессий в целом, убирая возможность
    инъекции сессионного ID и его кражи.

    Замечание:

    Идентификатор сессии может утечь через закладку в браузере, URL посланный по почте,
    сохранённый исходник HTML.

  • session.trans_sid_tags=[игнорируемые теги]

    (PHP 7.1.0 >=) Вы не должны перезаписывать ненужные HTML-теги.
    Значения по умолчанию должно быть достаточно для большинства случаев. Старые версии PHP
    для этого используют url_rewriter.tags.

  • session.trans_sid_hosts=[список хостов]

    (PHP 7.1.0 >=) Эта настройка определяет белый список хостов, для которых
    разрешено прозрачное управление идентификаторами сессий. Никогда не добавляйте
    недоверенные хосты. Если данная настройка пустая, то будет разрешено только для $_SERVER[‘HTTP_HOST’].

  • session.referer_check=[ваш исходный URL]

    Если session.use_trans_sid
    включён, то рекомендуется использовать эту опцию, если это возможно.
    Это уменьшает риск для инъекции сессионного ID. Если ваш сайт
    находится по адресу http://example.com/, то установите этой опции значение http://example.com/.
    Обратите внимание, что при использовании HTTPS, браузер не отправляет
    referrer заголовок. Таким образом, этот параметр не является достаточно
    надёжным показателем безопасности, но, всё же, рекомендуется его использовать.

  • session.cache_limiter=nocache

    Убедитесь, что содержимое HTTP не кешируется для аутентификационной сессии.
    Допускается кешировать только неконфиденциальный контент. Иначе
    содержимым могут воспользоваться. Можно использовать значение “private”,
    если содержимое HTTP не содержит чувствительные к безопасности данные. Учтите, что
    “private” может оставлять конфиденциальные данные в общем кеше клиентов.
    Значение “public” можно использовать только, если HTTP-контент вообще не содержит
    никаких конфиденциальных данных.

  • session.sid_length=”48″

    (PHP 7.1.0 >=) Чем длиннее идентификатор сессии, тем он надёжнее.
    Рекомендуемая длина – 32 символа и больше. В любом случае, не менее 26 символов
    требуется для session.sid_bits_per_character=”5″.

  • session.sid_bits_per_character=”6″

    (PHP 7.1.0 >=) Чем больше бит используется для символов идентификатора
    сессии, тем более надёжные идентификаторы будут созданы для той же длины идентификатора сессии.

  • session.hash_function=”sha256″

    (PHP 7.1.0 <) Более сложная хеш-функция будет создавать более сложный сессионный ID.
    Хотя коллизии с хешом почти не происходят и с MD5-хешом, тем не менее
    разработчику лучше использовать функции SHA-2 или новее. Разработчики
    также могут использовать сложные функции sha384 и sha512. Удостовертесь, что вы используете
    достаточно энтропии для этих функций.

  • session.save_path=[общедоступный каталог для чтения]

    Если установлено в общедоступный каталог для чтения всем, такой как
    /tmp (по умолчанию), другие пользователи на
    сервере могут захватить сеансы, получив список
    файлов в этом каталоге.

  • Php: настройка во время выполнения – manual

    Being unable to find an actual copy of mod_files.sh, and seeing lots of complaints/bug fix requests for it, here’s one that works.  It gets all its parameters from PHP.INI, so you don’t have the opportunity to mess up:

    #!/bin/bash
    #
    # Creates directories for PHP session storage.
    # Replaces the one that “comes with” PHP, which (a) doesn’t always come with it
    # and (b) doesn’t work so great.
    #
    # This version takes no parameters, and uses the values in PHP.INI (if it
    # can find it).
    #
    # Works in OS-X and CentOS (and probably all other) Linux.
    #
    # Feb ’13 by Jeff Levene.

    [[ $# -gt 0 ]] && echo “$0 requires NO command-line parameters.
    It gets does whatever is called for in the PHP.INI file (if it can find it).
    ” && exit 1

    # Find the PHP.INI file, if possible:
    phpIni=/usr/local/lib/php.ini                        # Default PHP.INI location
    [[ ! -f “$phpIni” ]] && phpIni=/etc/php.ini            # Secondary location
    [[ ! -f “$phpIni” ]] && phpIni=                        # Found it?

    # Outputs the given (as $1) parameter from the PHP.INI file:
    # The “empty” brackets have a SPACE and a TAB in them.
    #
    PhpConfigParam() {
    [[ ! “$phpIni” ]] && return
    # Get the line from the INI file:
    varLine=`grep “^[     ]*$1[     ]*=” “$phpIni”`

        # Extract the value:
    value=`expr “$varLine” : “.*$1[     ]*=[     ]*[‘”]*([^'”]*)”`
    echo “$value”
    }

    if [[ “$phpIni” ]]
    then
    savePath=`PhpConfigParam session.save_path`
    # If there’s a number and semicolon at the front, remove them:
    dirDepth=`expr “$savePath” : ‘([0-9]*)’`
    [[ “$dirDepth” ]] && savePath=`expr “$savePath” : ‘[0-9]*;(.*)’` || dirDepth=0
    bits=`PhpConfigParam session.hash_bits_per_character`
    case “x$bits” in
    x)    echo “hash_bits_per_character not defined.  Not running.” ; exit 2 ;;
    x4) alphabet=’0 1 2 3 4 5 6 7 8 9 a b c d e f’ ;;
    x5) alphabet=’0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v’ ;;
    x6) alphabet=’0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v’
    alphabet=”$alphabet w x y z A B C D E F G H I J K L M N O P Q R S T U V W”
    alphabet=”$alphabet X Y Z – ,”
    ;;
    *)    echo “unrecognized hash_bits_per_character.  Not running.” ; exit 2 ;;
    esac
    else
    echo “Cannot find the PHP.INI file.  Not running.  Sorry.”
    exit 2
    fi

    # The depth of directories to create is $1.  0 means just create the named
    # directory.  Directory to start with is $2.
    #
    # Used recursively, so variables must be “local”.

    doDir() {
    local dir=”$2″
    if [[ -d “$dir” ]]
    then
    echo “Directory ‘$dir’ already exists.  No problem.”
    elif [[ -f “$dir” ]]
    then
    echo “FILE ‘$dir’ exists.  Aborting.” ; exit 2
    else
    if mkdir “$dir”
    then
    echo “Directory ‘$dir’ created.”
    else
    echo “Cannot create directory ‘$dir’.  Aborting.” ; exit 2
    fi
    fi
    chmod a rwx “$dir”
    if [[ $1 -gt 0 ]]
    then
    local depth=$(( $1 – 1 ))
    for letter in $alphabet
    do    doDir $depth “$dir/$letter”
    done
    fi
    }
    echo “Running with savePath=’$savePath’, dirDepth=$dirDepth, and bitsPerCharacter=$bits.”
    sleep 3

    doDir $dirDepth “$savePath”

    exit 0

    Php: функции для работы с сессиями – manual

    Sessions and browser’s tabs

    May you have noticed when you open your website in two or more tabs in Firefox, Opera, IE 7.0 or use ‘Control N’ in IE 6.0 to open a new window, it is using the same cookie or is passing the same session id, so the another tab is just a copy of the previous tab. What you do in one will affect the another and vice-versa. Even if you open Firefox again, it will use the same cookie of the previous session. But that is not what you need mostly of time, specially when you want to copy information from one place to another in your web application. This occurs because the default session name is “PHPSESSID” and all tabs will use it. There is a workaround and it rely only on changing the session’s name.

    Put these lines in the top of your main script (the script that call the subscripts) or on top of each script you have:

    <?php

    if(version_compare(phpversion(),‘4.3.0’)>=0) {

    if(!
    ereg(‘^SESS[0-9] $’,$_REQUEST[‘SESSION_NAME’])) {

    $_REQUEST[‘SESSION_NAME’]=‘SESS’.uniqid();

    }

    output_add_rewrite_var(‘SESSION_NAME’,$_REQUEST[‘SESSION_NAME’]);

    session_name($_REQUEST[‘SESSION_NAME’]);

    }

    ?>


    How it works:

    First we compare if the PHP version is at least 4.3.0 (the function output_add_rewrite_var() is not available before this release).

    After we check if the SESSION_NAME element in $_REQUEST array is a valid string in the format “SESSIONxxxxx”, where xxxxx is an unique id, generated by the script. If SESSION_NAME is not valid (ie. not set yet), we set a value to it.

    uniqid(”) will generate an unique id for a new session name. It don’t need to be too strong like uniqid(rand(),TRUE), because all security rely in the session id, not in the session name. We only need here a different id for each session we open. Even getmypid() is enough to be used for this, but I don’t know if this may post a treat to the web server. I don’t think so.

    output_add_rewrite_var() will add automatically a pair of ‘SESSION_NAME=SESSxxxxx’ to each link and web form in your website. But to work properly, you will need to add it manually to any header(‘location’) and Javascript code you have, like this:

    <?php

    header
    (‘location: script.php?’.session_name().‘=’.session_id()

    .
    ‘&SESSION_NAME=’.session_name());

    ?>

    <input type=”image” src=”button.gif” onClick=”javascript:open_popup(‘script.php?<?php

    echo session_name(); ?>=<?php echo session_id(); ?>&SESSION_NAME=<?php echo session_name(); ?>‘)” />

    The last function, session_name() will define the name of the actual session that the script will use.

    So, every link, form, header() and Javascript code will forward the SESSION_NAME value to the next script and it will know which is the session it must use. If none is given, it will generate a new one (and so, create a new session to a new tab).

    May you are asking why not use a cookie to pass the SESSION_NAME along with the session id instead. Well, the problem with cookie is that all tabs will share the same cookie to do it, and the sessions will mix anyway. Cookies will work partially if you set them in different paths and each cookie will be available in their own directories. But this will not make sessions in each tab completly separated from each other. Passing the session name through URL via GET and POST is the best way, I think.

    Автоматический запуск сеанса

    При необходимости применения сессий в приложении, есть возможность запускать сеанс автоматически без использования функции session_start.

    В файле php.ini есть параметр session.auto_start, который позволяет запускать сеанс автоматически для каждого запроса. По умолчанию установлено значение 0 (выкл), и вы можете установить его на 1 (вкл), чтобы включить функцию автоматического запуска.

    С другой стороны, если у вас нет доступа к файлу php.ini, и вы используете веб-сервер Apache, эту переменную можно задать с помощью файла .htaccess.

    Если вы добавите строку выше в ваш .htaccess файл, то это должно автоматически запускать сессии в вашем PHP-приложении.

    Использование cookie

    По умолчанию вся информация о сессии, включая ID, передается в cookie. Но так бывает не всегда. Некоторые пользователи отключают cookie в своих браузерах. В таком случае браузер будет передавать идентификатор сессии в URL.

    www.example.org/index.php?PHPSESSID=n2cnj59d7s3p30fjs0jfn28nf

    Использование функции session_start

    Метод, в котором сессия запускается функцией session_start, вы будете видеть часто.

    Важно, чтобы функция session_start вызывалась в начале скрипта, перед отправкой чего-либо браузеру. В противном случае, вы столкнётесь с печально известной ошибкой Headers are already sent.

    Использование шифрования

    Если на вашем сайте должна обрабатываться конфиденциальная информация, такая как номера кредитных карт (привет от Sony), следует использовать SSL3.0 или TSL1.0 шифрование. Для этого при установке cookie следует указывать true для параметра secure.

    Если вы храните пароль сессии в переменной $_SESSION (все-таки лучше использовать sql), то не стоит хранить его в открытом виде.

    Как запустить сессию

    В этом разделе мы обсудим, как запустить сессию в PHP.

    Всякий раз, когда вы хотите поработать с переменными сеанса, необходимо убедиться, что сеанс уже запущен. Сеанс в PHP можно запустить несколькими способами.

    Как изменять и удалять переменные сеанса

    Можно изменять или удалять переменные сеанса, созданные ранее в приложении так же, как обычные переменные PHP.

    Давайте посмотрим, как изменять переменные сессии.

    Как получить идентификатор сеанса

    Как мы уже рассмотрели ранее, сервер создаёт уникальный номер для каждой новой сессии. Если вы хотите получить идентификатор сеанса, можно использовать функцию session_id, как показано в следующем фрагменте.

    Обработка входа с сессиями и файлами «куки» (cookie)

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

    1. Пользователь открывает страницу входа на веб-сайт.
    2. После отправки формы входа, сервер, на другом конце, аутентифицирует запрос, проверив введённые учётные данные.
    3. Если учётные данные, введённые пользователем, верны, сервер создаёт новый сеанс. Сервер генерирует уникальное случайное число, которое называется идентификатором сеанса. Также, на сервере, создаётся новый файл, который используется для хранения информации, относящейся к сеансу.
    4. Затем, идентификатор сеанса передаётся обратно пользователю, вместе с тем, что он запросил. За кулисами этот идентификатор сеанса отправляется в заголовке ответа «куки» PHPSESSID (так называется по умолчанию).
    5. Когда браузер получает ответ от сервера, он получает заголовок куки-файла PHPSESSID. Если в браузере разрешены «куки», то он сохранит этот PHPSESSID, в котором хранится идентификатор сеанса, переданный сервером.
    6. Для последующих запросов, «кука» PHPSESSID передаётся обратно на сервер. Когда сервер получает «куку» PHPSESSID, он пытается инициализировать сеанс с этим идентификатором сеанса.  Он делает это, загружая файл сеанса, который был создан ранее во время инициализации сеанса. Затем он инициализирует суперглобальную переменную массива $_SESSION с данными, хранящимися в файле сеанса.

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

    Привязка по ip-адресу


    В определенных ситуациях (не всегда) следует установить привязку по IP-адресу. В основном когда количество пользователей ограничено и имеют статичные IP. Проверка может быть либо по списку разрешенных IP-адресов,

    Создание переменных сеанса

    В этом разделе мы изучим, как инициализировать переменные сессии в PHP.

    Как мы уже обсудили, при запуске сеанса, инициализируется суперглобальный массив $_SESSION с соответствующей информацией о сессии. По умолчанию, он инициализируется в виде пустого массива, и вы можете хранить больше информации, используя пару ключ–значение.

    Давайте рассмотрим следующий пример кода, который показывает, как инициализировать переменные сеанса.

    Срок действия сессии

    Ограничьте время жизни сессии, а также время действия cookie. По умолчанию срок действия сессии 1440 секунд. Изменить это значение можно через php.ini и .htaccess. Пример для .htaccess:

    # Время жизни сессии в секундахphp_value session.gc_maxlifetime 3600# Время жизни куки в секундахphp_value session.cookie_lifetime 3600

    Заключение

    В этой статье мы изучили основы обработки сеансов в PHP. Это ключевая концепция, которая позволит вам сохранять информацию для веб-страниц.

    В первой половине статьи мы обсудили основные концепции сеансов, а затем мы создали несколько примеров на PHP, чтобы продемонстрировать, как вы могли создавать и уничтожать сеансы, а также манипулировать переменными сеанса.

    Похожее:  Статьи - Сеть - Отправка по SMTP с авторизацией

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *