Безопасность
Защита от 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();
Предыдущий раздел
Кэширование