Развитие языков программирования растёт с большой скоростью
Скачать 2.79 Mb.
|
PHP: Junior Kit 181 Вопросы и упражнения для самоконтроля 1. Что такое сессия и как она работает? 2. Как можно задать значение переменной сессии? 3. Для чего нужно запускать работу сессий? 4. Как бы вы создали систему регистрации в своем приложении? 5. Как завершать работу сессий? 13 Безопасность На безопасности никогда нельзя экономить. Безопасность пользователя или потребителя всегда должна быть на высоком уровне. Перед тем как мы перейдем к самой теме безопасности в РНР я для начала расскажу об том какие существует методы взлома приложений. Одним из самых распространенных способов является использование так званных инъекций. Инъекции как раз и назвали инъекциями через то что злоумышленник как будто делает инъекцию нашему приложению чтобы "заразить" его вредным кодом, который нарушит работу приложения. PHP: Junior Kit 182 Очень часто используются SQL-инъекции, которые содержат в себе вредный SQL код, инъекции часто внедряют в формы для введения каких-то данных. Чтобы избежать инъекций используется фильтрация данных которая запрещает использование вредных SQL-инъекций. Сейчас было создано очень много способов для того чтобы избежать всего этого. От использования самого простого кода до использования многих паттернов и библиотек которые предназначены для того чтобы фильтровать вредные данные. Кроме SQL-инъекций, вредный код злоумышленник может также внедрить с помощью сессий. Или ещё злоумышленник может использовать сессию чтобы украсть данные другого пользователя. Существует много способов взлома приложения и пользователей. Иногда пользователя сами идут на шаг к злоумышленник веря что они получили сообщение от разработчиков и т.п. и т.д. Конечно же сейчас с использованием многих фреймворков и библиотек разработка выглядит по-другому. И разработчику не приходиться очень долго мучатся над созданием фильтрованием данных, когда за него это уже сделал фреймворк. Если кто то не знает, то фреймворк это набор инструментов и библиотек для облегчения процесса разработки приложения для программиста. И начнём мы с вами с фильтрации данных строк, которые были введены в формулу пользователем. 13.1 Фильтрация данных Представим себе ситуацию, что пользователь вводит данные которые содержат в себе вредные символы с помощью которых можно сделать команду SQL. Чтобы избежать вредных символов, а точнее символов с помощью которых можно построить инъкции, нужно воспользоваться функцией str_replace(): PHP: Junior Kit 183 $bad_symbols = array("!", "#", ".", ";", ":", "/", "$", "%", "@"); $plaintText = "Hello w@rld!"; // Это будут данные которые мы с вами обработаем $clear_data = str_replace($bad_symbols, "", $plaintText); // Результат: Hello wrld ?> Как вы видите, то эта функция имеет целых три параметра. Первый параметр это символ(ы), которые мы хотим заменить в определенной строке, второй параметр это то на что мы хотим заменить эти символы и третий это уже строка в которой мы хотим сделать данную операцию. Я использовал массив символов которые надо заменить. Конечно же, можно было сделать и так: $bad_symbol = "$"; $plainText = "$var"; $plainText = str_replace($bad_symbol, "", $plainText); // Результат: var ?> Вообще для фильтрации данных в РНР были созданы отдельные функции. Например, есть функция filter_has_var() которая проверяет существование переменной с помощью заданного типа. Ниже показан таблица функций назначенных для фильтрации данных: Функция Действие filter_has_var() Проверяет существование переменной с указанным типом. filter_id() Возвращает PHP: Junior Kit 184 идентификатор принадлежащий фильтру. filter_input_array() Получает массив переменных и при необходимости фильтрует их. filter_input() Получает переменную и при необходимости фильтрует её. filter_list() Возвращает список всех поддерживающих фильтров. filter_var_array() Принимает массив переменных и при необходимости фильтрует её. filter_var() Фильтрует переменную с помощью заданного фильтра. - Табл. 24 - Функции для фильтрации данных в РНР Функция filter_has_var() Как уже было сказано функция предназначена для того чтобы проверить существование определенной переменной с заданным типом данных. Функция имеет два параметра, первый это один из этих типов: INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV. PHP: Junior Kit 185 Вам уже немного становиться понятно из названий этих типов что это такое. Второй параметр функции это название переменной, которую мы хотим проверить. Функция возвращает ответ только в двух логических значениях, TRUE и FALSE. Если операция прошло успешно то значение будет равно истине (TRUE), если наоборот то тогда ложи(FALSE). Пример: $_GET["value"] = "test"; print_r(filter_has_var(INPUT_GET, "value")); // Значение будет равно истине то есть TRUE // Здесь мы делаем проверку значения переменной в массив $_GET, на тип INPUT_GET похожую вещь можно также сделать с типом INPUT_POST $_POST["test"] = "PHP Book"; print_r(filter_has_var(INPUT_POST, "test")); // Здесь также ответ получим значении истины ?> Проверка здесь осуществляется на такие простые типы как GET и POST. Функция filter_id() Функция возвращает ответ в числом виде идентификатора определенного фильтра, например: ?> В этом примере мы достаем значение идентификатора фильтра validate_email. PHP: Junior Kit 186 Функция filter_input_array() Функция имеет три параметра первый это один из типов INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT ENV. Второй параметр это массив в котором определяются атрибуты для фильтра, и третий параметр добавляет в результат ключи со значением NULL. Пример фильтрации: $filters = array( "title" => array( "filter" => FILTER_CALLBACK, "flags" => FILTER_FORCE_ARRAY, "options" => "ucwords" ), "email" => FILTER_VALIDATE_EMAIL, ); print_r(filter_input_array(INPUT_POST, $filters)); ?> Пример выглядит немного сложно, если посмотреть внимательно то у нас здесь есть 2 переменные это title и email которым мы задаем параметры на фильтрацию данных. Можно заметить, что где первая переменная мы задаем параметры с помощью флагов, то есть с помощью индекса flags. Функция filter_input() Работает почти также само, как и filter_input_array только здесь уже у нас не массив а одна переменная. Функция имеет четыре параметра, первый это типы для переменной которые вам уже были показаны несколько раз, т.е. INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER и INPUT_ENV. PHP: Junior Kit 187 Второй параметр это уже имя переменной, которой мы хотим сделать фильтрацию. Третий это идентификатор фильтра, который мы хотим применить к данной переменной, и четвертый это массив в котором мы задаем дополнительные параметры для фильтрации. Сделаем такой пример: $GET["id"] = 1; print_r(filter_input(INPUT_GET, "id", FILTER_VALIDATE_INT)); // Как вы видите, то здесь мы применили фильтр FILTER_VALIDATE_INT. Фильтры вызываются как константы ?> Полный список фильтров я пока что показывать не буду. Разве что в конце этого раздела покажу таблицу, где есть их описание. Переходим к следующей функции. Функция filter_list() Функция не имеет параметров, её надо вызывать в цикле foreach() чтобы посмотреть список всех поддерживаемых фильтров. Вот как это выглядит: $filter) { echo "" . $filter . "" . filter_id($filter); } ?> Если функцию не вызвать в этом цикле то мы не получим никаких результатов. Дальше у нас идет ещё две функции filter_var_array() и filter_var(), они работают так же само как и filter_input_array() и filter_input() только имеют разные названия. PHP: Junior Kit 188 Давайте сделаем несколько реальных примеров с фильтрацией данных. Конечно же, для реализации фильтрации данных в РНР можно использовать не только функции показаны выше но и любые функции в общем. Например, вот пример фильтрации входных данных на пробелы и запретные символы: $symbols = array("!", "", ",", ".", "<", ">", "/", "\", "?", "{", "}", "[", "]", "=", "+", "-", "_", "*", "&", "^", ":"); $plaint_text = "[Hello!]"; $plaint_text = str_replace($symbols, "", $plaint_text); // Удаляем символы которые были указаны в массиве symbols $plaint_text = str_replace(" ", "", $plain_text); // Удаляем пробелы ?> Здесь уже намного больший массив из символами. Если мы хотим сделать фильтрование HTML-тегов то надо воспользоваться функцией strip_tags() , функция имеет два параметра, в первом мы указываем строку для фильтрации, а во втором указываем теги которые не надо удалять, пример: $text = " |