(Алекс)
Эксперт
Дата регистрации:
21.06.2013 14:56:26
Сообщений: 114
Здравствуйте.
Суть вопроса такова: делаю админ-панель для сайта (сайт на самописном движке по типу того, который был создан в курсе "Создание движка на PHP и MySQL 2.0" ). Там есть достаточно полезный класс Request, который получает данные из запросов и делает их безопасными. Если мы в этом классе обработаем данные, скажем, из формы добавления статьи, то всё html-форматирование (все примененные теги, для придания нужного вида) пропадет, так как там присутствует функция htmlspecialchars() Если ее убрать, то, по-идее, админка не потеряет в безопасности?
Еще вопрос по авторизации. Мне кажется, что в случае админ-панели, наверное, не стоит заходить в БД и проверять наличие пользователя-админа, а просто вынести эти данные в константы в тот же Config, чтоб лишний раз не нагружать сервер. Правильно ли так делать или нет?
gemiks
Мастер
Дата регистрации:
17.03.2013 18:03:11
Сообщений: 177
По первому вопросу, админка никак не потеряет в безопасности, так как только админ будет грузить html код и прочее, он ведь не будет сам себе вредить.
Второй вопрос, если вы используете один и тот же клас request для сайта и для админки, тогда сам сайт будет уязвим.
Насчет админа, вы ведь понимаеет, что такой вариант сработает только для одно админа, а если добавить еще одного? Да можно сделать массив с логинами и паролями админов, но.. Вообще я бы сделал у каждого юзера в базе ячейку типу status и туда ставил или 0 простой юзер или 1 админ, занес бы в сессию, и потом это значение сверял и разрешал бы доступ к админке (это не такая уж и сильная нагрузка)
(Алекс)
Эксперт
Дата регистрации:
21.06.2013 14:56:26
Сообщений: 114
Спасибо большое за ответ. По-поводу Request, используются разные классы.
По-поводу нескольких админов, я уже тоже подумал на счет этого, это, действительно, не удобно из-за того, что придется вручную расширять массив с админами.
Еще один вопрос, по-поводу организации сессий. Где лучше всего начинать сессии: в файле index.php или где-нибудь еще? Когда я смотрел уроки из видео курса по созданию движка, то в файле index.php не было старта сессий.
gemiks
Мастер
Дата регистрации:
17.03.2013 18:03:11
Сообщений: 177
По курсу, сессии начинались там где ими пользовались, то есть была такая конструкция if(!session_id()) session_start();
То есть мы проверяем, была ли начата сессия, если нет, то начинаем её.
Как по мне это хороший вариант.
(Алекс)
Эксперт
Дата регистрации:
21.06.2013 14:56:26
Сообщений: 114
я тоже делаю так, но, почему то, если не указать эту конструкцию в index-файле, то сессии не работают.
gemiks
Мастер
Дата регистрации:
17.03.2013 18:03:11
Сообщений: 177
Можете привести код в качестве примера
(Алекс)
Эксперт
Дата регистрации:
21.06.2013 14:56:26
Сообщений: 114
index.php
set_include_path(get_include_path().PATH_SEPARATOR.'core'.PATH_SEPARATOR.'modules'.
PATH_SEPARATOR.'controllers'.PATH_SEPARATOR.'library'.PATH_SEPARATOR.'validators' );
spl_autoload_extensions('_class.php' );
spl_autoload_register();
$router = new Router();
UserController_class.php
class UserController extends MainController {
public function auth() {
if (!session_id()) session_start();
if (isSet($_POST['auth_button'])) {
$user = new User();
$user->auth();
}
parent::redirect($_SERVER['HTTP_REFERER']);
}
public function logout() {
if (!session_id()) session_start();
$user = new User();
$user->logout();
parent::redirect($_SERVER['HTTP_REFERER']);
}
}
User_class.php
class User {
private $login = '';
private $password = '';
public function __construct() {
$request = new Request();
$this->login = $request->getDataByName('login' );
$this->password = md5($request->getDataByName('password' ));
}
private function getUserFromDB() {
$params = array(
'where' => $this->getWhere(),
'result' => 'row',
'table' => 'users',
'field' => '',
'colname' => '',
'value' => '',
'start' => 0,
'limit' => 0,
'order' => false
);
$db = DataBase::getDBO();
return $db->select($params);
}
public function auth() {
if (isSet($_POST['auth_button'])) {
$user_data = $this->getUserFromDB();
if (!empty($user_data)) {
$_SESSION['login'] = $user_data['login'];
$_SESSION['password'] = $user_data['password'];
$_SESSION['avatar'] = $user_data['photo'];
$_SESSION['error_auth'] = 0;
}
else $_SESSION['error_auth'] = 1;
}
}
public function logout() {
if (!session_id()) session_start();
unset($_SESSION['login']);
unset($_SESSION['error_auth']);
unset($_SESSION['password']);
}
private function getWhere() {
return " WHERE `login` = '".$this->login."' AND `password` = '".$this->password."'";
}
}
Массив Сессий проверил, там есть пользователь. Но на странице, вместо приветствия, выводится ошибка, неправильные данные (У меня она появляется, если $_SESSION['error_auth'] == 1)
(Алекс)
Эксперт
Дата регистрации:
21.06.2013 14:56:26
Сообщений: 114
P.S. пробелы поле кавычки, перед скобкой поставил, чтоб не раздражала замена на картинку
gemiks
Мастер
Дата регистрации:
17.03.2013 18:03:11
Сообщений: 177
Как я понял, у вас ошибка в методе auth в User_class.php
Вы проверяете не пустой ли массив, но эта функция может не корректно сработать, попробуйте проверить какое-то определенное значение типу if(isset($user_data['login'])) то мы записываем в сессию.
(Алекс)
Эксперт
Дата регистрации:
21.06.2013 14:56:26
Сообщений: 114
Да, спасибо, помогло. Проблему решил.