Проверка безопасности PHP-сессии

0

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

Во всяком случае, мой вопрос. Я нашел этот веб-сайт с большим количеством проверок безопасности сеанса: https://wblinks.com/notes/secure-session-management-tips/, просматривая его, большинство из них имеют смысл для меня. Тем не менее, большинство сбивает меня с толку - КОГДА тоже называют эти проверки.

Я называю эти проверки на каждой странице? С одной стороны, это имело бы смысл, потому что кто-то мог захватить или что-то другое, сеанс на каждой странице? С другой стороны, это будет стоить дополнительное время, чтобы завершить эту проверку на каждой странице, превысив, возможно, увеличение времени загрузки?


В этот момент у меня есть следующий код.

<?php

if ($_SESSION['_USER_LOOSE_IP'] != long2ip(ip2long($_SERVER['REMOTE_ADDR']) & ip2long("255.255.0.0"))
    || $_SESSION['_USER_AGENT'] != $_SERVER['HTTP_USER_AGENT']
    || $_SESSION['_USER_ACCEPT'] != $_SERVER['HTTP_ACCEPT']
    || $_SESSION['_USER_ACCEPT_ENCODING'] != $_SERVER['HTTP_ACCEPT_ENCODING']
    || $_SESSION['_USER_ACCEPT_LANG'] != $_SERVER['HTTP_ACCEPT_LANGUAGE']
    || $_SESSION['_USER_ACCEPT_CHARSET'] != $_SERVER['HTTP_ACCEPT_CHARSET']
    || !isset($_SESSION['MY_SERVER_GENERATED_THIS_SESSION'])) {


    // Destroy and start a new session
    sec_session_destroy(); // Destroy session on disk
    sec_session_start();

    // Log for attention of admin and re-authenticate user...
}

if ($_SESSION['SESSION_START_TIME'] < (strtotime("-1 hour")) || $_SESSION['_USER_LAST_ACTIVITY'] < (strtotime("-20 mins"))) {
    sec_session_destroy();
    //Expire session and re-authenticate user...
}

function sec_session_start() {
    setcookie("sid",            // Name
          session_id(),         // Value
          strtotime("+1 hour"), // Expiry
          "/",                  // Path
          ".serellyn.net",      // Domain
          true,                 // HTTPS Only
          true);                // HTTP Only

    // Store these values into the session so I can check on subsequent requests.
    $_SESSION['_USER_AGENT']           = $_SERVER['HTTP_USER_AGENT'];
    $_SESSION['_USER_ACCEPT']          = $_SERVER['HTTP_ACCEPT'];
    $_SESSION['_USER_ACCEPT_ENCODING'] = $_SERVER['HTTP_ACCEPT_ENCODING'];
    $_SESSION['_USER_ACCEPT_LANG']     = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
    $_SESSION['_USER_ACCEPT_CHARSET']  = $_SERVER['HTTP_ACCEPT_CHARSET'];
    $_SESSION['MY_SERVER_GENERATED_THIS_SESSION'] = true;

    // Only use the first two blocks of the IP (loose IP check). Use a
    // netmask of 255.255.0.0 to get the first two blocks only.
    $_SESSION['_USER_LOOSE_IP'] = long2ip(ip2long($_SERVER['REMOTE_ADDR']) 
                                          & ip2long("255.255.0.0"));

    $_SESSION['SESSION_START_TIME'] = time();
    $_SESSION['_USER_LAST_ACTIVITY'] = time();

    sec_session_start();            // Start the PHP session 
}

function sec_session_destroy() {
    session_unset(); 
    session_destroy();
    session_start();
    session_regenerate_id(true);
}

Мой последний вопрос: имеет ли смысл код или имеет какие-либо предложения, чтобы сделать его лучше или менее запутанным. И следует ли включать это на каждую страницу или всего несколько страниц?

заранее спасибо

  • 0
    «Кажется, что сессии настолько« прерваны », насколько это возможно с точки зрения безопасности», а? Это все равно, что сказать: «Похоже, машины настолько« опасны », насколько это может быть безопасно»
  • 0
    Также обратите внимание, что большинство из вышеперечисленного уже обрабатывается при правильной настройке сеансов и только с использованием зашифрованных соединений.
Показать ещё 1 комментарий
Теги:
security
session

1 ответ

1
Лучший ответ

Почему они не выполнили больше проверок безопасности в самом коде сеансов...

Обычная "модель сеанса" заключается в том, что идентификатор сеанса является сильным секретом, и все, что утечки этого идентификатора, следует считать уязвимостью.

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

$ _SESSION ['_ USER_AGENT']! = $ _SERVER ['HTTP_USER_AGENT']

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

$ _SESSION ['_ USER_ACCEPT']! = $ _SERVER ['HTTP_ACCEPT']

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

($ _SESSION ['_ USER_LOOSE_IP']! = Long2ip (ip2long ($ _ SERVER ['REMOTE_ADDR']) и ip2long ("255.255.0.0"))

Это лучше, чем точное соответствие IP, но будет по-прежнему ломаться, когда мобильный пользователь переключается с одной сети telco или wifi на другой.

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

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

  • 0
    Спасибо за ваш вклад.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню