Вам нужно беспокоиться о безопасности функций php?

#php #security #class #function

#php #Безопасность #Класс #функция

Вопрос:

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

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

Правильно ли я думаю, или я совершенно сбит с толку?

Заранее спасибо за вашу помощь!

Ответ №1:

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

Как вы сказали, PHP интерпретируется на сервере. Пользователь не может вызвать ваш исходный код или прикоснуться к нему, если вы не сделаете это возможным.

Важно: Даже если пользователи не могут видеть пользовательский интерфейс для чего-либо, это не означает, что это безопасно.

Если посещение определенной ссылки или отправка определенной формы будут выполнять определенную функцию, скрытие ссылки или формы не решит вашу проблему. Пользователь все еще может ввести ссылку в своем браузере или подделать POST-запрос, который выполняет действие.

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

Примеры:

 if (isUserLoggedIn()) {
    doSomething();
}

if ($user->isAdmin()) {
    doSomething();
}

if ($_SESSION['user']['role'] == 'admin') {
    doSomething();
}
  

Комментарии:

1. @arex1337: Функции вызываются через скрипты, которые вызываются с помощью кнопок и еще чего-то не такого, как вы сказали, но у меня было бы два совершенно отдельных интерфейса для клиентов и администраторов — так что клиенты не будут иметь доступа к интерфейсу администратора, который использует функции, к которым я не хочу, чтобы у клиентов был доступ. Я просто хотел убедиться, что мое мышление было правильным, прежде чем я продолжу разработку.

2. В ответ на вашу правку — разве использование проверки безопасности на каждой странице и скрипте, использующем функции, не предотвратило бы именно эту проблему? Если они не пройдут проверку — я мог бы просто убить скрипт с помощью die() или exit(). Редактировать: в интерфейсе администратора была бы реализована эта проверка.

3. @Key Да, если вы можете заблокировать доступ ко всей странице, это, безусловно, приемлемо. Однако, если безопасности «на страницу» недостаточно, вам нужно сделать это «за действие».

4. @Key То, что вы делаете, по сути, то, что я говорю, что вы должны делать. Только вы поместили всю страницу внутрь doSomething() — что вполне приемлемо.

5. @Key — Если вы еще этого не сделали, серьезно подумайте об использовании проверенного фреймворка, такого как CakePHP, Symfony, ExpressionEngine / CodeIgniter (возможно, самого простого для понимания) или какого-либо другого. Не пытайтесь внедрять собственное решение, если вам трудно понять риски безопасности, присущие веб-разработке.

Ответ №2:

Как вызываются ваши функции?

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

Просто убедитесь, что они не могут редактировать какую-либо переменную непреднамеренным образом…

Комментарии:

1. Мои функции вызываются через скрипты, доступ к которым осуществляется через формы, ссылки и т.д.

2. Будет ли изменение чего-либо в URI выполнять какую-либо функцию? Или вносить нежелательные правки в то, как работает функция?

3. Я бы обезопасил скрипт, проверив, есть ли у пользователя к нему доступ — поэтому я не думаю, что был бы способ сделать это, даже имея физический доступ к странице (без авторизации доступа к странице)