Безопасность в PHP. Явное приведение типов.
Операторы прямого приведения данных.
Совет: там, где от этого зависит безопасность, или результат может быть неоднозначным, приводите явно тип данных, проверяйте входящие переменные со стороны клиента на существование, пусты ли они, и к какому типу относятся. Аккуратность написания скриптов избавит от чрезмерной отладки в дальнейшем и сделает Ваш сайт менее чувствительным к действиям недоброжелателей,и более стабильным в работе.
Приведём несколько операндов, которые позволяют сделать это легко и без особых усилий при программировании на языке PHP, а так же поговорим о функциях приведения типов.
Примечание автора: операторы не изменяют тип переменной, но делает попытку приведения переменной и возвращает значение соответствующего типа.
$var = (int)$some_var, (integer)$some_var – явное приведение переменной $some_var к целочисленному типу
$var = (float)$some_var, (real)$some_var, (double)$some_var – явное приведение переменной $some_var к вещественному типу
$var = (array)$some_var – явное приведение переменной $some_var к массиву
$var = (string)$some_var – явное приведение переменной $some_var к массиву
$var = (bool)$some_var, (boolean)$some_var – явное приведение переменной $some_var логическому значению (true,false)
$var = (object)$some_var – явное приведение переменной $some_var к объекту
Новшества PHP 5:
(unset)$some_var – присвоение типа NULL, уничтожение переменной, освобождение памяти.
Новшества PHP 5.2.1:
(binary) $some_var – приведение переменной к бинарному представлению.
Примеры использования:
Рассмотрим передачу id статьи через массив GET news.php?id=23
Вариант подготовки параметра для безопасной передачи в запрос к базе данных:
?
1
$news_id = (int)$_GET[“id”];
Еще одной интересной функцией является abs, которую советую применять при фильтрации входных данных для заведомо неотрицательных величин, например уникального идентификатора статьи, который является по умолчанию числом уникальным, положительным, с auto increment:
abs($var) – Принимаемые параметры: $var – переменная целого (или вещественного) типа. Возвращает абсолютное по модулю число: для всех отрицательных величин возвращается положительное, для всех положительных возвращается просто значение переменной
Рассмотрим предыдущий пример в новом ракурсе:
Так как integer может быть как положительным, так и отрицательным целым числом, перепишем предыдущий пример с использованием функции abs:
Вариант подготовки параметра для безопасной передачи в запрос к базе данных:
?
1
$news_id = abs((int)$_GET[“id”]);
Функции явного приведения данных.
(int) intval($var,[$base = 10]) – Принимаемые параметры: $var – переменная для приведения типов. Приводит переменную к целочисленному типу. Возвращает переменную, приведенную к целочисленному типу, в случае с массивом 0 если массив пуст, 1 – если есть элементы, в случае со строкой: если удаётся преобразовать к целому числу – то целое число, или 0 в обратном случае.
$base = основание, десятичная система исчисления по умолчанию.
(float) floatval($var) – Принимаемые параметры: $var – переменная для приведения типов. Приводит переменную к вещественному типу. Возвращает переменную, приведенную к вещественному типу, в случае неудачи возвращает 0.
(bool) settype(&$var, string $type ) – Принимаемые параметры: $var – переменная для приведения типов, $type – к какому типу привести переменную:
“boolean”,”bool” – приведение типа переменной к логическому значению (true, false),
“integer”,”int” – приведение типа переменной к целому значению,
“float”,”double” – приведение типа переменной к вещественному значению,
“string” – приведение типа переменной к строковому значению,
“array” – приведение к массиву,
“object” – приведение типа переменной к объекту,
“null” – приведение типа переменной к типу NULL (освобождение занимаемой памяти).
Производит прямое приведение переменной к значению указанного типа. В случае удачи возвращает true, иначе – false.
Общирный пример практического использования вышеописанных функций при программировании на языке PHP:
Приведём пример безопасного запроса к базе данных с получением id новости из строки запроса:
<?php$id= isset($_GET["id"]) ?abs(intval($_GET["id"])) : 0;If(!empty($id)){$q="SELECT `news_text` FROM `news` WHERE `news_id`=".$id;$p= mysql_query($q);if($p&&is_resource($p)){list($text) = mysql_fetch_row($p);echo$text;}}?>