В разработке любого программного обеспечения программисту нужно не только писать понятный код с ясной продуманной архитектурой, но и не забывать о всяческих проверках и продумывать неверные действия пользователей, например, проверять входящие данные от пользователей, ведь Вашим продуктом будут пользоваться как обычные люди, которые могут совершить ошибку при отправке каких-либо данных, так и злоумышленники (простыми словами — «хакеры»), которые будут искать уязвимости. И в том, и в другом случае, если в коде допущены уязвимости — это может привести к серьезным проблемам, вплоть до финансовых убытков, что, естественно, крайне нежелательно.
Обычно начинающие программисты из-за своей неопытности могут упустить (не предугадать) важные моменты безопасности, но все мы люди, поэтому даже крупные корпорации с внушительным штатом профессиональных опытных программистов могут не увидеть «дырки» в программном обеспечении, ведь даже в корпорации Google или Apple были громкие истории, связанные с утечкой данных пользователей путем взлома разных сервисов этих компаний.
Безопасность кода в Moodle
Как и любая open-source система она постоянно обновляется и, при обнаружении уязвимостей — оперативно устраняется, поэтому, на данный момент, при поддержке многотысячного сообщества Moodle такого вида «баги» практически исключены. Другое дело плагины Moodle: они пишутся энтузиастами, которым, конечно, отдельное спасибо, но все же их уровень никому неизвестен, поэтому перед публикацией каждый плагин проходит определенную проверку core-программистами Moodle, они по опыту знают что проверять, например, один из главных программистов Moodle после проверки очередного плагина написал в своем твиттере:
When we ask #moodledev to follow the #moodle coding style, we have reasons.$a=$_REQUEST['a']; $sql = "SELECT … WHERE a={$a}";
— David Mudrák (@mudrd8mz) 19 декабря 2014
Проверка, фильтрация и обработка входных данных Moodle
Описание встроенных функций Moodle для обеспечения безопасности кода
- Описание — Приводит входящие данные к кодировке utf8, недопустимые символы отбрасываются
$value
— переменная, которую надо привести к utf8
fix_utf8($value)
- Описание — очищает переменные и приводит к соответствующим типам. Используются встроенные Moodle-функции
optional_param
иrequired_param
- Расположение файла —
lib/moodlelib.php
$param
— параметр (переменная), который нужно обработатьPARAM_RAW
— ничего не «чистит», использует функциюfix_utf8
PARAM_RAW_TRIMMED
— ничего не «чистит», но обрезает лишние пробелы в начале и конце значения. Использует базовую функцию из phptrim
после функцииfix_utf8
PARAM_CLEANHTML
— «Очищает» HTML-строкуPARAM_INT
— приводит значение к целому числуPARAM_FLOAT
— приводит значение к числу с плавающей точкойPARAM_ALPHA
— убирает все символы кроме строчных букв, убирает заглавные буквы в том числеPARAM_ALPHAEXT
— убирает все символы кроме букв, оставляет строчные и заглавные буквыPARAM_ALPHANUM
— убирает все символы кроме любых букв и цифрPARAM_ALPHANUMEXT
— убирает все символы кроме любых букв, цифр и тиреPARAM_SEQUENCE
— убирает все символы цифрPARAM_BOOL
— приводит к 1 (истина) или 0 (ложь)PARAM_NOTAGS
— удаляет все HTML-теги, использует php-функциюstrip_tags
иfix_utf8
PARAM_TEXT
— оставляет текст, удаляет все HTML-теги, но оставляет тегиlang
PARAM_COMPONENT
— возвращает название компонента без его префикса, например из строкиmod_somecomponent
вернетсяsomecomponent
PARAM_SAFEDIR
— если Вы хотите вернуть имя папки в Moodle, то используйте этот параметр, он приводи строку в соответствие с правилами названия папок в MoodlePARAM_SAFEPATH
— то же самое что иPARAM_SAFEDIR
, но допускаются также слэши вида/
PARAM_FILE
— убирает все подозрительные символы от названия файлаPARAM_PATH
— «чистит» представленную строку и преобразует ее в валидный путьPARAM_HOST
— если Вам необходимо вернуть валидный хост (в том числе IPv4-адрес)PARAM_URL
— валидирует URL-строкуPARAM_PEM
— валидирует сертификатPARAM_BASE64
— декодит в base64-форматPARAM_TAG
— возвращает имя тега из строкиPARAM_CAPABILITY
— проверяет на наличие capability, совпадающее с параметромPARAM_AUTH
— проверяет на наличие метода авторизацииPARAM_LANG
— проверяет на наличие соответствующей локалиPARAM_THEME
— проверяет на наличие соответствующей темы/шаблонаPARAM_USERNAME
— проверяет на наличие соответствующего логинаPARAM_EMAIL
— проверяет на соответствие предлагаемый адрес e-mail
$type
— ожидаемый тип параметра. Возможные значения:
clean_param($param, $type)
- Описание — очищает переменные и приводит к соответствующим типам. Используются встроенные Moodle-функции
- Описание — эта функция обрабатывает значение суперглобальных php-массивов $_GET, $_POST, $_REQUEST, ссылаясь на их ключи в параметре
$parname
. Главная особенность этой функции заключается в том, что если суперглобальный php-массив не содержит данного ключа, то возвращается значение по-умолчанию$default
- Расположение файла —
lib/moodlelib.php
$parname
— имя параметра суперглобального массива$default
— значение по-умолчанию если значение по ключу пустое или его не существует$type
— ожидаемый тип параметра.
optional_param($parname, $default, $type)
- Описание — эта функция обрабатывает значение суперглобальных php-массивов $_GET, $_POST, $_REQUEST, ссылаясь на их ключи в параметре
- Описание — эта функция аналогична функции
optional_param
, главное отличие, что нет значения по-умолчанию и если нужного ключа нет в суперглобальном массиве, то выводится ошибка об этом - Расположение файла —
lib/moodlelib.php
$parname
— имя параметра суперглобального массива$type
— ожидаемый тип параметра.
required_param($parname, $type)
- Описание — эта функция аналогична функции
- Описание — эта функция аналогична функции
optional_param
с тем лишь отличием, что переменная$parname
— это ключ у суперглобального массива и значение по этому ключу является массивом, например$_POST[$parname]
— массив. - Расположение файла —
lib/moodlelib.php
$parname
— имя параметра суперглобального массива$default
— значение по-умолчанию если значение по ключу пустое или его не существует$type
— ожидаемый тип параметра.
optional_param_array($parname, $default, $type)
- Описание — эта функция аналогична функции
- Описание — эта функция аналогична функции
optional_param_array
, отличие в отсутствии, как и у required_param, параметра$default
. При отсутствии ключа выдается ошибка. - Расположение файла —
lib/moodlelib.php
$parname
— имя параметра суперглобального массива$type
— ожидаемый тип параметра.
required_param_array($parname, $type)
- Описание — эта функция аналогична функции
- Описание — эта функция аналогична функциям
optional_param_array
иrequired_param_array
, но она принимает как параметр$param
уже готовую переменную (массив) - Расположение файла —
lib/moodlelib.php
$param
— переменная, которая будет обрабатываться$type
— ожидаемый тип параметра.$recursive
— если значения массива$param
также являются массивом, то при значенииtrue
они также будут обрабатываться данной функцией рекурсивно
clean_param_array(array $param = null, $type, $recursive = false)
- Описание — эта функция аналогична функциям
- Описание — проверяет является ли параметр
$value
целым числом - Расположение файла —
lib/moodlelib.php
$value
— переменная, которая будет обрабатываться
is_number($value)
- Описание — проверяет является ли параметр
- Описание — функция возвращает текстовые анкоры ссылок из HTML-кода
- Расположение файла —
lib/moodlelib.php
$string
— переменная, HTML-код, в котором содержится тегa
strip_links($string)
Пример
//например, Вам необходимо получить и обработать параметр somevar из URL страницы: http://mymoodlesite.ru/somepage.php?somevar=lenauth, записать это значение в переменную и сделать запрос к базе данных //$somevar = $_GET['somevar']; //как делать нельзя!!! $somevar = optional_param('somevar', '', PARAM_ALPHA); //отлично! вернет lenauth //или $somevar = optional_param('somevar', '', PARAM_AUTH); //не только вернет lenauth, но и проверит если ли такой метод авторизации
Замечание
Не стоит делать частые ненужные проверки данной функцией абсолютно всех данных, только если эти данные действительно необходимо проверять, потому что при проверке часто вызываются функции регулярных выражений php, иногда делаются лишние запросы к базе данных, что создает дополнительную нагрузку на сервер.
tezekse
Это обработка персональных данных? И что, нужно обязательно визуальное подтверждение согласия? У нас абитуриенты бумажку подписывают при сдаче доков на поступление в ВУЗ. Я проверяльщиков пошлю в приемную комиссию эти бумажки проверяь, если их не устроит объяснение про механизм создания учетки с подтверждением пользовательского соглашения
Droidmod.ru
Это обработка персональных данных? И что, нужно обязательно визуальное подтверждение согласия? У нас абитуриенты бумажку подписывают при сдаче доков на поступление в ВУЗ. Я проверяльщиков пошлю в приемную комиссию эти бумажки проверять, если их не устроит объяснение про механизм создания учетки с подтверждением пользовательского соглашения