Что не так с этим PHP-кодом, продолжайте получать ошибку № 2? - PullRequest
0 голосов
/ 11 августа 2009
<?php 
session_start();
// After user logged in
session_regenerate_id();
$_SESSION['logged_in'] = 1;
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
$_SESSION['agent'] = $_SERVER['HTTP_USER_AGENT'];


// Session Checking 
function session_check(){
    if(isset($_SESSION['logged_in']) && !empty($_SESSION['logged_in'])){
         if(isset($_SESSION['ip']) && !empty($_SESSION['ip']) && ($_SESSION['ip'] == $_SERVER['REMOTE_ADDR'])){
            if(isset($_SESSION['agent']) && !empty($_SESSION['agent']) && ($_SESSION['agent'] == $_SERVER['HTTP_USER_AGENT'])){ 
                return true;
            } else {
                echo "Not allowed to view this page. Error no: 3. You will be redrected to login page in few seconds";
                header('Refresh: 3; url=./login.php');
            }   
        } else {
            echo "Not allowed to view this page. Error no: 2. You will be redirected to login page in few seconds";
            header('Refresh: 3; url=./login.php');
        }
    } else {
        echo "You are not allowed to view this page. Error no: 1. You will be redirected to login page in few seconds";
        header('Refresh: 3; url=./login.php');
        return false;
    }
}

И я продолжаю получать ошибку №2, когда я бегу:

if(session_check()){ echo "something";}

Это потому, что я использую динамический IP?

Достаточно ли хорош мой код для защиты от перехвата сеанса?

Если исключить ($_SESSION['ip'] != $_SERVER['REMOTE_ADDR']), он отлично работает.

Важный вопрос:

Каковы ваши методы противодействия угону сессий? Можете поделиться с нами? Используя проверку IP, проверку агента пользователя или, возможно, другие методы ??

Ответы [ 5 ]

1 голос
/ 11 августа 2009

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

Вот отличная статья о безопасности сеансов: http://phpsec.org/projects/guide/4.html. В нижней части страницы показано, как можно сделать проверку пользовательского агента еще более безопасной с помощью хеширования md5. Также вот выдержка относительно IP-адресов:

Неразумно полагаться на что-либо на уровне TCP / IP, например на IP-адрес, поскольку это протоколы более низкого уровня, которые не предназначены для учета действий, выполняемых на уровне HTTP. Один пользователь может иметь разные IP-адреса для каждого запроса, а несколько пользователей могут иметь один и тот же IP-адрес.

0 голосов
/ 11 августа 2009

А согласен с Мариусом, возможно, что-то еще происходит.
Я позволил себе сделать вашу if..else логику более читабельной:

function session_check(){
    if (empty($_SESSION['logged_in'])){
        echo "Error no: 1.";
        return false;
    } 
    if (empty($_SESSION['ip']) || ($_SESSION['ip'] != $_SERVER['REMOTE_ADDR'])){
        echo "Error no: 2.";
        return false;
    }
    if (empty($_SESSION['agent']) || ($_SESSION['agent'] != $_SERVER['HTTP_USER_AGENT'])){ 
        echo "Error no: 3.";
        return false;
    }

    return true;
}
0 голосов
/ 11 августа 2009

Вы не можете ничего повторить перед отправкой записи в заголовок, если не используете буферизацию вывода. Я предлагаю вместо этого вернуть код состояния вместо того, чтобы помещать заголовок в функцию session_check. В конце концов, он называется session_check, а не session_check_redirect (): D

Из руководства PHP по заголовку ()

Помните, что header () должен быть вызван перед отправкой любого фактического вывода, либо обычными тегами HTML, пустым строки в файле или из PHP. Это очень распространенная ошибка при чтении кода include () или require (), функции или другая функция доступа к файлу, и есть пробелы или пустые строки, которые выводятся перед заголовком () вызывается. Такой же проблема существует при использовании одного Файл PHP / HTML.

0 голосов
/ 11 августа 2009

Я не вижу, что не так с вашим кодом. Как и предлагалось, попробуйте var_dumping для содержимого $_SERVER и $_SESSION в начале session_check(), чтобы увидеть, что они содержат.

Даже если вы используете динамический IP-адрес, он не должен меняться между двумя запросами (обычно он меняется, когда вы отключаете сетевой кабель или отключаете карту Wi-Fi).

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

Предлагаю прочитать OWASP рекомендации по передовому опыту в области веб-безопасности.

0 голосов
/ 11 августа 2009

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

...