как проверить систему аутентификации? - PullRequest
0 голосов
/ 14 сентября 2010

РЕДАКТИРОВАТЬ: После жалобы о назначении себе ответ, я хочу обновить, что предоставленные ответы не были удовлетворительными.Никто не вышел и прямо не сказал, что это ваша проблема, сделайте это, и у вас будет решение.Простых предложений недостаточно для получения награды за вознаграждение.Наконец, проблема была с настройками сервера, и после некоторого исследования серверных сессий и изучения Stackoverflow / Serverfault я смог определить, как лучше всего решить эту проблему.Поэтому я не чувствовал, что было бы несправедливо отмечать мой собственный ответ как правильный.

У меня есть система аутентификации на основе php, которая использует LDAP для проверки личности и использует сеансы для поддержания статуса аутентификации пользователей.,

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

Вот моя функция аутентификации, которая запускает сеанс:

function authenticateUser($user, $password){
    //assuming ldap connection and verification of user login/pass
    //this is what will happen with authenticate user which is called 
    //when user submits login/pass on authentication form. 
    $_SESSION['id'] = $uID;
    $time = time(); 
    $_SESSION['time'] = $time;                                  
    $_SESSION['lastActivity'] = $time; 
    $_SESSION['expiration'] = $time+$cookieExpiration; 
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];  
    $_SESSION['secret'] = md5(rand());                          
    $_SESSION['userHash'] = getSessionHash();  
    $_SESSION['firstLogin'] = isFirstLogin($user); 
    //assign cookie to user and log authentication 
    giveCookie("userHash", $_SESSION['userHash'],0);
    logAuthenticationAttempt($user, $_SERVER['REMOTE_ADDR'], 1);
    return true;
}//end authenticateUser 

Функция cookie:

function giveCookie($name, $value, $expiration=0){
    global $path, $site; 
    setcookie("userHash", $_SESSION['userHash'], $expiration, $path, $site, true, true);    
}//end giveCookie 

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

function isValidUser(){
    global $links; global $userName; global $userID; global $cookieExpiration; 
    if(isset($_COOKIE['userHash']) and isset($_SESSION['userHash'])){
        if($_COOKIE['userHash'] == $_SESSION['userHash']){

         $userName = $_SESSION['nameN'];
         $userID = $_SESSION['id'];
         //update userHash cookie for additinoal expiration time this way session
         $time = time(); 
         $expiration = $time+$cookieExpiration; 
         $_SESSION['lastActivity'] = $time; 
         giveCookie("userHash", $_SESSION['userHash'],0);
         $_SESSION['expiration'] = $expiration; 
         return true;
         }
    }
    return false;
}//end isvalidUser() 

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

На странице, которая запрашивает аутентификацию, то, что я делаю вверху, выглядит следующим образом:

if(!isValidUser()){changePage($links['login']."?refer=".$links['requestHelp']);}
//note: changePage is just a function for header("location: somepage.php"); 

Ответы [ 6 ]

2 голосов
/ 20 сентября 2010

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

2 голосов
/ 14 сентября 2010

Вы, похоже, путаете аутентификацию, авторизацию и управление сессиями.Если вы хотите протестировать все 3, тогда вам понадобится какой-то автоматизированный инструмент тестирования, способный воспроизводить сессионное воспроизведение HTTP-сеанса с поддержкой сценариев (например, http :: рекордер / www :: mechaninze с Perl).Если вы хотите исследовать управление сеансом, используя ваше развернутое приложение, то я бы порекомендовал настроить страницу входа в систему, чтобы получить информацию о текущем сеансе и о том, как пользователь перенаправлен туда.Вам также следует рассмотреть возможность регистрации файла cookie сеанса на веб-сервере.

1 голос
/ 20 сентября 2010

Написать функциональный тест. Вы можете использовать SimpleTest WebTestCase для подобных вещей. См. Документацию по адресу: http://www.simpletest.org/en/web_tester_documentation.html

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

0 голосов
/ 20 сентября 2010

Похоже, это была простая неверная конфигурация самого сервера.Поскольку эта серверная среда является общей средой для сотен сайтов, у меня нет возможности изменять параметры сервера в php.ini и т.1003 *

session_set_cookie_params(time()+$expiration, $path, $domain, true, true); 

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

0 голосов
/ 20 сентября 2010

Взгляните глубже на session.configuration

Я бы (если вы не хотите продумывать свою концепцию) изменил бы isValidUser, чтобы записать то, что вы можете получить до return false

function isValidUser(){
    global $cookieExpiration; // since $links isn't used and $userName and $userId come from $_SESSION no need for global there
    if( (isset($_COOKIE['userHash']) and isset($_SESSION['userHash'])) 
        and ($_COOKIE['userHash'] == $_SESSION['userHash']) ){

         $userName = $_SESSION['nameN']; // why these lines?
         $userID = $_SESSION['id']; // see above
         //update userHash cookie for additinoal expiration time this way session
         $time = time(); 
         $expiration = $time+$cookieExpiration; 
         $_SESSION['lastActivity'] = $time; 
         giveCookie("userHash", $_SESSION['userHash'],0);
         $_SESSION['expiration'] = $expiration; 
         return true;
    }
    // $logger ist just an example an could be a p.e Zend_Logger Object
    $logger->debug($_SESSION); // serialize if needed
    $logger->debug($_COOKIE); // serialize if needed
    $logger->err(error_get_last());
    return false;
}//end isvalidUser()

И вы уверены, что звонили session_start() до isValidUser()

0 голосов
/ 20 сентября 2010

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

Если они пройдут испытание, то у них будет установлен переменный $ _SESSION, который дает им уровни авторизации.

Не передавайте $ _SESSION другим переменным, как вы. Не используйте $ username = $ _SESSION ['username'], потому что теперь у вас есть небезопасная переменная ($ username), которая может содержать защищенные данные. Но это не так.

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

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