Сер 282013
 

Безопасность в PHP. Проверяем типы переменных.

Известно, что PHP относится к слабо типизированным языкам программирования. Что же это значит? Мы можем проводить различные операции между переменными разного типа, и получать «что-то» на выходе. С одной стороны, это удобно. Строка превращается в целое число, целое число может стать объектом, а объект плавно перейти в массив. Но любой программист при создании сайтов на языке php рано или поздно сталкивается с тем, что во многих случаях типы переменных следует приводить (или, как минимум, проверять перед началом использования).

Примечание: такое строгое отношение к переменным связано с тем, что большинство скриптов на php подвержено нездоровому вниманию злоумышленников с целью подстановки параметров различного типа в строке запроса сайта. Это может привести от генерации ошибки с раскрытием пути, по которому находится файл, вплоть до обхода некоторых ограничений. Например: повышения прав пользователя в ранних версиях WordPress путём передачи имени пользователя как массива, а не строки, в скрипт аутентификации в admin панели, или же подстановки в строку запроса вместо целых чисел (например, id новости) – специально сформированных запросов sql с целью несанкционированного доступа, создание на сайте так называемых sql инъекций.

Так что, по возможности, проверяйте типы переменных перед их использованием или явно приводите их во время программирования на PHP.

Приведём функции, которые будут нам полезны с целью контроля безопасности входных данных:

(string) trim($str) – Принимаемые параметры: $var – строка для удаления пробельных символов и символов разрыва строки. Обрезает символы конца строки и пробельные символы вначале и конце строки, возвращает переменную строкового типа.
(bool) is_string($var) – Принимаемые параметры: $var – переменная для проверки. Является ли переменная $var строкой? Возвращает: true: если является, false: если не является.
(bool) is_numeric($var) – Принимаемые параметры: $var – переменная для проверки. Является ли переменная $var набором цифр ? Возвращает: true: если является, false: если не является.
(bool) is_float($var) – Принимаемые параметры: $var – переменная для проверки. Является ли переменная $var вещественным числом? Возвращает: true: если является, false: если не является.
(bool) is_array($var) – Принимаемые параметры: $var – переменная для проверки. Является ли переменная $var массивом? Возвращает: true: если является, false: если не является.
(bool) is_int($var) – Принимаемые параметры: $var – переменная для проверки. Является ли переменная $var целым числом? Возвращает: true: если является, false: если не является.
(bool) isset($var) – Принимаемые параметры: $var – переменная для проверки. Проверяет, существует ли переменная $var (любой тип данных), если существует, возвращает true, иначе возвращает false.
(bool) is_resource($var) – Принимаемые параметры: $var – переменная для проверки. Является ли переменная $var ресурсом? Возвращает: true: если является, false: если не является.
(bool) empty($var) – Принимаемые параметры: $var – переменная для проверки. Проверяет, пуста ли существующая переменная или нет, возвращаемые значения: true для значений (“”, 0, 0.0, “0”, NULL,FALSE,array()), false в остальных случаях
Пример использования при программировании в PHP скриптах:

Передаем в форму через пост запрос массив данных $user, полученный при регистрации пользователя:

<?php
        $user               = $_POST["user"];
        $sizeof             = sizeof($user);
        $username           = "";
        $password           = "";
        $user_id            = 0;
if(is_array($user) && $sizeof && isset($user["username"]) && isset($user["password"];)){
        $username           = trim($user["username"]);
        $password           = trim($user["password"]);
        $password           = is_int($user["user_id"]) ? $user["user_id"]: 0;
}
?>

Еще один пример использования в PHP скриптах:

Зададим вопрос к базе данных:

<?php
        $query              = "SELECT `news_text` FROM `news` WHERE `news_id`=5";
        $p                  = mysql_query($query);
        if($p && is_resource($p)){
            list($news_text)= mysql_fetch_row($p);
        }
?>

Замечание: дело в том, что очень полезно проверять, является ли параметр ресурсом, перед передачей функции, заведомо требующей параметр типа ресурс. Например, в случае sql запросов такой подход может подсказать об ошибке, которая произошла в запросе, или попросту о том, что сервер базы данных (или текущее подсоединение) занято.

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)