Безопасность в 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
Вариант подготовки параметра для безопасной передачи в запрос к базе данных:
$news_id = (int)$_GET["id"];
Еще одной интересной функцией является abs, которую советую применять при фильтрации входных данных для заведомо неотрицательных величин, например уникального идентификатора статьи, который является по умолчанию числом уникальным, положительным, с auto increment:
- abs($var) – Принимаемые параметры: $var – переменная целого (или вещественного) типа. Возвращает абсолютное по модулю число: для всех отрицательных величин возвращается положительное, для всех положительных возвращается просто значение переменной
Рассмотрим предыдущий пример в новом ракурсе:
Так как integer может быть как положительным, так и отрицательным целым числом, перепишем предыдущий пример с использованием функции abs:
Вариант подготовки параметра для безопасной передачи в запрос к базе данных:
$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; } } ?>