Безопасность в PHP. Явное приведение типов

Безопасность в 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 – к какому типу привести переменную:
    1. «boolean»,»bool» – приведение типа переменной к логическому значению (true, false),
    2. «integer»,»int» – приведение типа переменной к целому значению,
    3. «float»,»double» – приведение типа переменной к вещественному значению,
    4. «string» – приведение типа переменной к строковому значению,
    5. «array» – приведение к массиву,
    6. «object» – приведение типа переменной к объекту,
    7. «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;
    }
    }
    ?>
Комментарии