MV framework logo
  • Архитектура
    • Философия
    • Технологии
    • CMF
    • История версий
  • Админ панель
  • Поддержка
  • Обратная связь
  • Примеры кода
    • Новостная лента
    • Слайдер с баннерами
    • Список с фильтрацией
    • Форма с загрузкой файла
    • AJAX форма на jQuery
    • Вопросы и ответы
    • Каталог с товарами
    • Авторизация пользователя
    • Регистрация пользователя
    • Личный кабинет пользователя
Скачать Версия 2.7 от 06.06.2023
Документация
  • Архитектура
    • Философия
    • Технологии
    • CMF
    • История версий
  • Админ панель
  • Поддержка
  • Обратная связь
  • Примеры кода
    • Новостная лента
    • Слайдер с баннерами
    • Список с фильтрацией
    • Форма с загрузкой файла
    • AJAX форма на jQuery
    • Вопросы и ответы
    • Каталог с товарами
    • Авторизация пользователя
    • Регистрация пользователя
    • Личный кабинет пользователя
Начало работы
  • Установка и запуск
  • Структура папок
  • Запуск простого сайта
  • Предустановленные модели
  • SQLite начало работы
  • Системные настройки
  • Миграции
Модели (models)
  • Общие принципы моделей
  • Типы данных
  • Настройка модели
  • Простые модели
  • Внешние ключи
  • Деревья
  • Многие ко многим
  • Группа
  • Управление записями
  • Управление простыми моделями
  • Дополнительные возможности
Шаблоны (views) и маршрутизация (routes)
  • Общие принципы шаблонов
  • Объект класса Router
  • Объект MV
  • Index, default и 404 шаблоны
  • Создание нового шаблона
  • Вывод данных в шаблоне
  • Объект класса Record
  • Файлы и изображения
  • Дата и время
  • Редиректы
  • Отправка email
  • Специальные методы
Формы
  • Создание форм
  • Настройка полей формы
  • Правила проверки полей формы
  • Проверка полей формы
  • Работа с данными формы
  • Использование данных из моделей
  • Методы форм
SQL запросы
  • Конструктор запросов
  • Прямые запросы
  • Постраничная разбивка
  • Сортировка
  • Фильтрация
  • Загрузка из csv файлов
Сессии и безопасность
  • Работа с сессиями
  • AJAX
  • Кэширование
  • Безопасность
  • Отладка
Плагины
  • Общие принципы плагинов
  • Дополнения к административной панели
Документация
Начало работы
  • Установка и запуск
  • Структура папок
  • Запуск простого сайта
  • Предустановленные модели
  • SQLite начало работы
  • Системные настройки
  • Миграции
Модели (models)
  • Общие принципы моделей
  • Типы данных
  • Настройка модели
  • Простые модели
  • Внешние ключи
  • Деревья
  • Многие ко многим
  • Группа
  • Управление записями
  • Управление простыми моделями
  • Дополнительные возможности
Шаблоны (views) и маршрутизация (routes)
  • Общие принципы шаблонов
  • Объект класса Router
  • Объект MV
  • Index, default и 404 шаблоны
  • Создание нового шаблона
  • Вывод данных в шаблоне
  • Объект класса Record
  • Файлы и изображения
  • Дата и время
  • Редиректы
  • Отправка email
  • Специальные методы
Формы
  • Создание форм
  • Настройка полей формы
  • Правила проверки полей формы
  • Проверка полей формы
  • Работа с данными формы
  • Использование данных из моделей
  • Методы форм
SQL запросы
  • Конструктор запросов
  • Прямые запросы
  • Постраничная разбивка
  • Сортировка
  • Фильтрация
  • Загрузка из csv файлов
Сессии и безопасность
  • Работа с сессиями
  • AJAX
  • Кэширование
  • Безопасность
  • Отладка
Плагины
  • Общие принципы плагинов
  • Дополнения к административной панели
MV tracker

Безопасность

Защита от SQL инъекций

Перед подстановкой значений в SQL запрос (в прямом запросе) их надо обработать специальной функцией "secure()" для экранирования одиночной кавычки. Данный метод содержется в классе "Database" и доступен в объекте "$db", находящимся в каждой модели и плагине.

Внимание! Конструктор запросов самостоятельно применяет метод "secure()" к входящим данным. Если используются Прямые запросы, то при вызове метода "secure()" не нужно обрамлять значение в одиночные кавычки, т.к. данный метод в свою очередь вызывает метод PDO :: quote().

//Данные, которые необходимо обезопасить
$param = $_GET["param"];

//Для значения "type" кавычки не нужны
$row = $this -> db -> getRow("SELECT * FROM `products` 
                              WHERE `active`='1' 
                              AND `type`=".$this -> db -> secure($param);

//Для целочисленных значений лучше применить функцию intval()
$row = $this -> db -> getRow("SELECT * FROM `table` WHERE `id`='".intval($_GET["id"])."'");

XSS при заполненни форм

Данные вводимые в поля формы (которые созданы объектом класса "Form" как в разделе Создание форм) обрабатываются функцией "htmlspecialchars()" в режиме "ENT_QUOTES". Таким образом потенциально опасные HTML символы переводятся с мнемоники (сущности).

HttpOnly cookie

Сессионные cookie, а также cookie, выставляемые административной панелью, имеют по умолчанию включенный флаг HttpOnly, что делает невозможным считать их с помощью JavaScript. Данная опция ставит дополнительный барьер для проведения XSS. Режим HttpOnly может быть отключен в файле "config/setup.php".

Безопасность административной панели

  • При двух неудачных попытках авторизации пользователю предлагается ввести captcha.
  • Восстановление пароля только после ввода captcha и подтверждения по ссылке на email.
  • Привязка сессии к браузеру и ip адресу.
  • Токены для исключения возможности CSRF при операциях в административной панели.
  • Разлогинивание пользователя по таймауту (с возможность авлологина).

URL в объекте Router

В объекте Router из url адреса удаляется одиночная кавычка, при этом GET параметры остаются в исходном виде и в случае их применения в прямых запросах необходимо вызвать метод "secure()" из объекта базы данных.

$row = $this -> db -> getRow("SELECT * FROM `products` 
                              WHERE `color`=".$this -> db -> secure($_GET['color']);

Использование CSRF токена для защиты формы

Для использование индивидуального CSRF токена для формы необходимо вызвать метод useTokenCSRF() и отобразить в форме скрытое поле с токеном. Желательно, чтобы проект при этом использовал сессию ('SessionSupport' => true в файле "config/setup.php").

$form = new Form($fields); 
$form -> useTokenCSRF();

//Валидация csrf токена происходит автоматически
if(!empty($_POST))
    $form -> getDataFromPost() -> validate();

//Внутри html тэга <form> 
<? echo $form -> displayTokenCSFR(); ?>

Для отправки форм методом AJAX, порядок действий отличается

//В шаблоне из которого пойдет AJAX запрос
$form = new Form($fields);
$form -> useAjaxTokenCSRF();

//Либо если форма присутствует только в html формате объект $form создавать не надо
//Необходимо сформировать html код токена до вывода любого html на странице
$token_html = Form :: createAndDisplayAjaxTokenCSRF();

//Внутри html тэга <form> 
<? echo $token_html; ?>

//Далее при отправке формы поле с токеном должно войти в параметры запроса
//В файле-обработчике AJAX запроса необходимо также задать параметр токена

$form = new Form($fields);
$form -> useAjaxTokenCSRF();

//И далее токен будет проверен при валидации формы
if(!empty($_POST))
    $form -> getDataFromPost() -> validate();

Предыдущий раздел

Кэширование

Следующий раздел

Отладка
MV tracker

© 2012-2023, MV framework team

English MV task tracker system Лицензия

Поделиться