Адекватный ли способ защиты админки?

Это базовый контроллер.
Если нет сессии админа, то редиректим на страницу авторизации.
public function __construct()
	{

		try {

			if ( !isset($_SESSION["admin"]) ) {

				$this->redirect("/auth");
				throw new \Exception("Ошибка доступа");

			}
			
			$this->view = new View();

		}

		catch(\Exception $e) {
			
			echo $e->getMessage();

		}

	}


Если человек обходит редирект, то видит текст исключения и фатальную ошибку, так как объект View() не создается.
e93de51a073d408fb40fcb4644b429d7.png

это базовый вид:
$this->view = new View();
в других контроллерах(например авторизации) работает так:
public function index() {

                //...
                $this->view->render("site/auth", ["model" => $model], "auth");

    }


Хватит ли этого для защиты? Распределение по правам доступа в админке мне не нужно.
  • Вопрос задан
  • 576 просмотров
Решения вопроса 2
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Что мешает добавить "else" ?
if ( !isset($_SESSION["admin"]) ) {
        $this->redirect("/auth");
        throw new \Exception("Ошибка доступа");
} else $this->view = new View();
Ответ написан
index0h
@index0h
PHP, Golang. https://github.com/index0h
Защита на глобальных переменных - это не самая хорошая идея. В любой точке кода строка
$_SESSION['admin'] = 1;
отключит ее.

В своей практике наталкивался на случаи, когда даже сами сотрудники добавляют в uploads вредоносный код, под видом невинных файлов (я уже молчу про анонимусов, которым захочется вас взломать). А в вашем случае взлом будет еще и нереально легким.
-- --
Контроль доступа как правило имеет смысл делать в экшнах, а не в конструкторе контроллера.
-- --
echo $e->getMessage(); - вот это плохая идея. Не выводите клиенту текст исключения, прописывайте его явно. Что будет, если словите исключение с куском SQL? Будете показывать структуру вашей БД кому попало?
-- --
Бросание исключения после редиректа обычно бессмысленно. Вы уже знаете ответ для клиента, завершайте процесс.
-- --
Кстати, фатальные исключения - это не круто, это признак говнаря, не делайте так.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@Fixid
Просто закройте через htpasswd
Ответ написан
Комментировать
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
Что значит обходит редирект?
Как он может это сделать?
Ответ написан
trevoga_su
@trevoga_su
какая-то бредятина
во первых, какого черта проверка на права торчит в конструкторе? это должен быть отдельный метод.
во вторых - нахрена там исключения, что они отлавливают, запахи детства?
в третьих редирект, т.е. http location отправляет браузеру заголовок и все. после него либо exit ставят, либо программа корректно завершается
обойти его никак нельзя, браузеру послали заголовок и умерли
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы