Исправьте коды состояния HTML для несанкционированного доступа и запрещенного доступа. (используя Ajax) - PullRequest
2 голосов
/ 02 августа 2011

Моему приложению PHP + JS + Ajax требуется, чтобы пользователи вошли в систему, а затем сохраняет данные для входа в систему в $ _SESSION.

Существует три типа пользователей: Пользователь, Модератор, Администратор.Каждый из них имеет больше прав, чем предыдущий.

Все запросы выполняются к ajax_req.php

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

Код для этого следующий:

if(isset($_SESSION['logged'])) {
    if(isset($_SESSION['group_id'])) {
        $group_id=(int)$_SESSION['group_id'];

        if($group_id==ADMIN_GROUP) {
            $login_success=1;
        } else if ($group_id==MODERATOR_GROUP) {
            $login_success=1;
        } else if ($group_id==USER_GROUP) {
            $login_success=1;
        } else {
            $login_success=-1;
        }
    } else {
        $login_success=-1;
    }
} 

if($login_success<1) {
    header('HTTP/1.1 401 Unauthorized');
    $ret = array('status' => 'FALSE', 'txt' => 'Unauthorized access. Please check if You are still logged in.' );
    print json_encode($ret); 
    exit();
}

Первый вопрос: правильно ли я делаю?

Второй вопрос

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

Далее у меня есть следующая функция:

function assert_right($group_id, $needed) {
    if($group_id==ADMIN_GROUP) {
        return true; 
    } else if ($group_id==MODERATOR_GROUP) {
        if($needed==USER_GROUP || $needed==MODERATOR_GROUP) {
            return true; 
        }
    } else if ($group_id==USER_GROUP) {
        if($needed==USER_GROUP) {
            return true; 
        }
    } 

    header('HTTP/1.1 403 Forbidden');
    $ret = array('status' => 'FALSE', 'txt' => 'Unauthorized access. You do not have sufficient rights to do this action.' );
    print json_encode($ret); 
    exit();
}

И перед чувствительным действием я вызываю

assert_right($_SESSION['group_id'], ADMIN_GROUP);

Второй вопрос: правильно ли возвращать 401 в первом случае и 403 во втором?По сути, 403 означает «Запрещено», что в соответствии с http://en.wikipedia.org/wiki/List_of_HTTP_status_codes означает «Запрос был законным запросом, но сервер отказывается отвечать на него. В отличие от 401 Несанкционированного ответа, аутентификация не будет иметь значения».Я также проверил https://dev.twitter.com/docs/error-codes-responses,, который был дан как ответ на другой вопрос.

Для меня 403 кажется правильным, потому что, если пользователь уже вошел в систему, то он / она, вероятно,не имеет учетной записи администратора.Более того, пользователь никогда не должен видеть это, если я не совершил программную ошибку или пользователь не взломал данные, отправленные через Ajax.

Еще одно замечание: пользователю не показываются коды состояния 401 или 403: они используются Ajaxи JavaScript, чтобы показать соответствующие сообщения об ошибках.Если получено 401, JavaScript показывает текст: «Похоже, что вы не вошли на сервер. Пожалуйста, откройте новое окно и войдите, чтобы продолжить. После того, как вы вошли, нажмите здесь, чтобы проверить соединение.».Если получено 403, отображается текст: «Похоже, у вас недостаточно прав для выполнения этой операции».

Правильно ли я использую эти коды ошибок?

1 Ответ

3 голосов
/ 02 августа 2011

Ваш код возврата вообще не важен, потому что это AJAX-запрос, поэтому вы можете вернуть все, что захотите. Вы возвращаете код ошибки, затем обрабатываете его, используя JS, затем возвращаете сообщение пользователю. Например, пользователь нажимает кнопку «Удалить», у него может не быть разрешения на это, поэтому вы возвращаете json: status: error, type: Разрешение Затем отобразите пользователю сообщение, относящееся к этому типу ошибки.

Вы должны объединить 1 и 2 вместе. Напишите функцию или класс для проверки их команды. Пример:

$check = $session_check(USER_COMMAND);
if ($check) //has right
else //no right.

function session_check($command){
     $userCmdList = array(COMMAND_1,2,3,4);
     $modCmdList = array(COMMAND_2,3,4,5,6,7);
     switch ($_SESSION['group_id']){
          case "admin":
               return true;
               break;
          case "mod":
               if !in_array($command,$modCmdList) return false;
               else return true;
               break;
          case "user":
               if !in_array($command,$userCmdList) return false;
               else return true;
               break;
          default:
               break;
    }
}

Также не забудьте использовать уникальный хэш для каждого сеанса, чтобы предотвратить сеанс hjhack

P / S: Это простой ответ, который следует за вашим текущим рабочим процессом. Другие улучшенные методы всегда доступны.

...