Предотвращение доступа к функции файла php

Я сделал php-скрипт, который действует как список дел. На стороне администратора (просто admin.php) есть таблица отображения, и эта таблица выбирает каждую запись из таблицы списка дел в mysql, а затем помещает кнопку удаления рядом с каждой записью.

Предотвращение доступа к функции файла php

Каждая кнопка удаления имеет тег привязки с идентификатором, основанным на конкретной связанной строке из mysql. Поэтому, когда кто-то нажимает кнопку удаления, URL-адрес переходит на /remove.php?id=ROWID.

Проблема в том, что кто-то может ввести этот URL-адрес с любой страницы с правильным идентификатором строки, он может удалить данные. На remove.php я использую метод $_GET, чтобы получить этот ROWID. Я мог бы создать форму и получить этот POST, который у меня есть для других функций на сайте. Но даже для них, если кто-то наберет add.php, они все равно смогут получить доступ к функциям добавления в php-скрипте.

Я попытался запустить сеанс с помощью session_start (); на странице admin.php (которая в конечном итоге будет заблокирована только для аутентифицированных пользователей с правами администратора), но если кто-то знает ссылку, он все равно сможет перейти на /remove.php?id=ROWID, даже не находясь в сеансе или не указав сеанс от администратора .php

Я что-то пропустил? Есть ли способ предотвратить доступ к remove.php для пользователей, прошедших проверку подлинности или находящихся в сеансе?

HTTP GET следует использовать для чтения Только. Даже в этом случае вам все равно потребуется реализовать уровень входа и контроля доступа - или, по крайней мере, простой HTTP Basic Auth.
CD001 10.04.2018 16:45

Вы пробовали использовать if?

Paul Spiegel 10.04.2018 16:47
remove.php необходимо проверить переменную сеанса, чтобы убедиться, что они вошли в систему.
Barmar 10.04.2018 16:47

@barmar, что-то вроде принято if (isset ($ _ SESSION ['errors'])) {// Что-то делать}

datasci 10.04.2018 17:04

Больше похоже на if (!isset($_SESSION['admin'])') { die("You're not logged in as admin"); }

Barmar 10.04.2018 17:06

@barmar Я попробую это через секунду, но логика заключается в том, что им сначала нужно будет получить доступ к admin.php, и если это так, тогда они будут изолированы от сеанса и смогут получить доступ к remove.php?

datasci 10.04.2018 17:08

Да в том-то и дело.

Barmar 10.04.2018 17:13

@Barmar Сработал как шарм. Есть ли способ установить тайм-аут или указать продолжительность сеанса?

datasci 10.04.2018 17:39

@Barmar Знаете ли вы, как я могу привязать сообщение об ошибке, если я возвращаю пользователя на страницу, с которой он пришел? Например, они переходят к remove.php, а затем возвращаются на страницу, с которой они пришли, используя: header ("Location: {$ _SERVER ['HTTP_REFERER']}"); но как мне привязать к этому сообщение об ошибке?

datasci 10.04.2018 18:49

Вы можете добавить параметр URL, например $_SERVER['HTTP_REFERER'] . '?error=message', и тогда страница сможет проверить наличие $_GET['error'] и где-нибудь отобразить сообщение.

Barmar 10.04.2018 19:07

@Barmar Еще раз спасибо за вашу помощь! Очень признателен

datasci 10.04.2018 19:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
12
56
1

Ответы 1

Благодаря вышеупомянутому сообщению,

Я использовал:

if (isset($_SESSION['ID'])){
    code goes here for if they are authenticated
}else{
    die("You're not logged in as admin"); 
}

Это запустит сеанс на page1.php, а на page2.php проверит, был ли сеанс запущен со страницы page1. В противном случае отобразится сообщение об ошибке (штамп).

Если вы хотите завершить сеанс пользователя в зависимости от продолжительности времени, используйте этот пример: http://thisinterestsme.com/expire-php-sessions/

Я думаю, вам следует подумать о if (!isset($_SESSION['ID'])) die("You're not logged in as admin"); , так как его легче читать, если у вас много кода.

sr9yar 10.04.2018 19:53

@ sr9yar Я только что включил тайм-аут сеанса, поэтому теперь мой код включает в себя приведенное выше с дополнительным оператором if в «код идет сюда», а затем if (! isset) в самом конце кода, чтобы оценить, является ли переменная не установлен на page1.php.

datasci 10.04.2018 20:09

Другие вопросы по теме