Моему приложению 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, отображается текст: «Похоже, у вас недостаточно прав для выполнения этой операции».
Правильно ли я использую эти коды ошибок?