Полезные функции в 1С-Битрикс: CheckSerializedData и NormalizePhone

Некоторые полезные функции в 1С-Битрикс, которые часто применяются при работе со строками: CheckSerializedData и NormalizePhone. Мы рассмотрим их назначение, параметры и наглядные примеры использования.

Полезные функции в 1С-Битрикс: CheckSerializedData и NormalizePhone

1. CheckSerializedData

Назначение

Функция предназначена для проверки корректности (валидности) сериализованной строки, поступающей от внешних источников, например, из глобальных массивов $_REQUEST, $_POST, $_GET и т.д.

Если в сериализованной строке обнаруживается сериализованный объект, функция возвращает false. Обычно это делается в целях безопасности, чтобы предотвратить потенциальные уязвимости (например, внедрение PHP-объектов со зловредными свойствами).

Объявление функции


function CheckSerializedData($str, $max_depth = 200)
{
    if (preg_match('/(^|;)[OC]\\:\\+{0,1}\\d+:/', $str)) // проверка на наличие сериализованных объектов
    {
        return false;
    }

    return true;
}
            

Обратите внимание, что в оригинальном примере параметр $max_depth не используется. В реальных проектах вы можете расширить проверку, если хотите анализировать глубину сериализованных данных, чтобы не допустить слишком вложенные структуры.

Параметры функции

Параметр Описание
$str Сериализованная строка, которую нужно проверить.
$max_depth (Опционально) Максимальная глубина вложенности данных. В данном коде не задействована напрямую.

Пример использования

Самый частый сценарий: мы получаем некую сериализованную строку (например, массив, который был сериализован через serialize()) из $_REQUEST и хотим убедиться, что в ней нет сериализованных объектов, способных нанести вред системе.


if (CheckSerializedData($_REQUEST["LIST_DATA"]))
{
    $arData = unserialize($_REQUEST["LIST_DATA"]);
    // Теперь с $arData можно безопасно работать,
    // например, обойти массив, вывести данные и т.д.
}
else
{
    // Если проверка не пройдена, значит есть вероятность
    // опасных объектов в строке
    echo "Ошибка: получены некорректные или потенциально опасные данные";
}
            

При такой проверке мы минимизируем риск выполнения нежелательного кода, который может быть внедрён через сериализованные объекты.

2. NormalizePhone

Назначение

Функция предназначена для приведения телефонного номера к «стандартизированному» виду. Она удаляет все нечисловые символы (кроме некоторых специальных, указанных в регулярном выражении), проверяет минимальную длину, обрабатывает различные префиксы (например, +8, 80, 011 и т.д.) и преобразует их к более привычному формату.

Объявление функции


function NormalizePhone($number, $minLength = 10)
{
    $minLength = intval($minLength);
    if ($minLength <= 0 || mb_strlen($number) < $minLength)
    {
        return false;
    }

    // Если номер начинается на +8, заменим +8 на 00 (пример конвертации)
    if (mb_strlen($number) >= 10 && mb_substr($number, 0, 2) === '+8')
    {
        $number = '00'.mb_substr($number, 1);
    }

    // Убираем из номера все нечисловые символы (кроме #,*,;,)
    $number = preg_replace("/[^0-9\#\*,;]/i", "", $number);

    if (mb_strlen($number) >= 10)
    {
        if (mb_substr($number, 0, 2) == '80' || mb_substr($number, 0, 2) == '81' || mb_substr($number, 0, 2) == '82')
        {
            // В оригинальном коде блок не содержит операций,
            // но при необходимости можно добавить обработку
        }
        else if (mb_substr($number, 0, 2) == '00')
        {
            // Убираем ведущие '00'
            $number = mb_substr($number, 2);
        }
        else if (mb_substr($number, 0, 3) == '011')
        {
            // Убираем ведущие '011'
            $number = mb_substr($number, 3);
        }
        else if (mb_substr($number, 0, 1) == '8')
        {
            // Заменяем ведущую 8 на 7
            $number = '7'.mb_substr($number, 1);
        }
        else if (mb_substr($number, 0, 1) == '0')
        {
            // Убираем ведущий 0
            $number = mb_substr($number, 1);
        }
    }

    return $number;
}
            

Параметры функции

Параметр Описание
$number Исходная строка, в которой содержится телефонный номер.
$minLength Минимальная длина номера. Если длина меньше этого значения, функция вернёт false.

Примеры использования

Пример 1. Стандартное приведение к формату, замена 8 на 7


$phone = "8(999)123-45-67";
$normalizedPhone = NormalizePhone($phone);
if ($normalizedPhone !== false)
{
    echo "Нормализованный номер: " . $normalizedPhone;
    // Вывод: Нормализованный номер: 79991234567
}
else
{
    echo "Телефонный номер некорректен или слишком короткий";
}
            

Пример 2. Обработка международного номера


$phone = "+8 (123) 456-78-90";
$normalizedPhone = NormalizePhone($phone);
if ($normalizedPhone !== false)
{
    echo "Нормализованный номер: " . $normalizedPhone;
    // Потенциально будет обработан как '00' + ...,
    // т.е. удалится '+8', превратится в 01234567890 и т.д.
}
            

Пример 3. Проверка минимальной длины


$phone = "12345"; // очень короткая строка
$normalizedPhone = NormalizePhone($phone, 7);
if ($normalizedPhone === false)
{
    echo "Номер не прошёл проверку, так как длина меньше допустимой";
}
            

Практические советы и рекомендации

  1. Всегда проверяйте входящие сериализованные данные Использование CheckSerializedData помогает предотвратить потенциальный взлом. Любая сериализованная строка, пришедшая от пользователя, может содержать «опасные» объекты.
  2. Нормализуйте телефонные номера Если вы собираете и храните номера пользователей, функция NormalizePhone поможет приводить их к единому формату (убрать лишние символы и маски), что упростит последующий поиск и работу в CRM или в любом другом модуле.
  3. Обработка ошибок Обязательно обрабатывайте возможные ошибки возврата. Например, NormalizePhone возвращает false, если номер не соответствует критериям.
  4. Безопасность превыше всего При работе с пользовательскими данными (сериализованными строками, входящими номерами телефонов и т.п.) не пренебрегайте валидацией и фильтрацией. Любые данные, полученные извне, потенциально уязвимы.

Заключение

Функции CheckSerializedData и NormalizePhone — это лишь малая часть инструментов, предоставляемых фреймворком 1С-Битрикс. Они значительно упрощают и делают безопаснее некоторые рутинные задачи: проверку входящих данных, валидацию и приведение телефонов к единому формату.

Надеемся, что данная статья поможет вам быстрее и эффективнее работать с текстовыми данными и номерами телефонов в проектах на 1С-Битрикс. Удачи в разработке!

Теги:  CheckSerializedData, NormalizePhone, PHP, безопасность, нормализация телефонных номеров

Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Аутсорсинг

готов помочь, если нет времени

договорная

Могу взять на себя работы по full-stack на основе готовой верстки

* если нет верстки, то возможность верстать с Figma в режиме редактора

Разработка интернет-магазина с готовой версткой

от 4 недель

от 90 000 рублей

* указана минимальная стоимость. Стоимость выбранной лицензии «1С-Битрикс» оплачивается отдельно.

Лендинг

от 3 дней

от 25 000 рублей

Разработка одностраничного сайта на платформе Битрикс

* стоимость зависит от наличия верстки, использования готового решения и т.д.