2015-01-07 6 views
0

Итак, я читаю сессии, и я должен сказать, я смущен. Кажется, что сеансы так же «сломаны», как могут быть соображения безопасности, почему они не внедрили больше проверок безопасности в самом коде сеансов ...Проверка безопасности сеанса PHP

В любом случае, мой вопрос. Я нашел этот веб-сайт с большим количеством проверок безопасности сессии: 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

«Кажется, что сеансы так же« сломаны », как могут быть соображения безопасности« да? Это похоже на высказывание: «Кажется, что автомобили« опасны », как может быть безопасным» – PeeHaa

+0

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

+0

Также обратите внимание, что проверка ip будет ошибочной на адресах ipv6. – PeeHaa

ответ

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 или Wi-Fi на другую.

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

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

+0

Благодарим вас за ввод. – Serellyn

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