Безопасность в 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
;
}
}
?>