Некоторые полезные функции в 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 "Номер не прошёл проверку, так как длина меньше допустимой";
}
Практические советы и рекомендации
- Всегда проверяйте входящие сериализованные данные
Использование
CheckSerializedData
помогает предотвратить потенциальный взлом. Любая сериализованная строка, пришедшая от пользователя, может содержать «опасные» объекты. - Нормализуйте телефонные номера
Если вы собираете и храните номера пользователей, функция
NormalizePhone
поможет приводить их к единому формату (убрать лишние символы и маски), что упростит последующий поиск и работу в CRM или в любом другом модуле. - Обработка ошибок
Обязательно обрабатывайте возможные ошибки возврата. Например,
NormalizePhone
возвращаетfalse
, если номер не соответствует критериям. - Безопасность превыше всего При работе с пользовательскими данными (сериализованными строками, входящими номерами телефонов и т.п.) не пренебрегайте валидацией и фильтрацией. Любые данные, полученные извне, потенциально уязвимы.
Заключение
Функции CheckSerializedData
и NormalizePhone
— это лишь малая часть инструментов, предоставляемых фреймворком 1С-Битрикс. Они значительно упрощают и делают безопаснее некоторые рутинные задачи: проверку входящих данных, валидацию и приведение телефонов к единому формату.
Надеемся, что данная статья поможет вам быстрее и эффективнее работать с текстовыми данными и номерами телефонов в проектах на 1С-Битрикс. Удачи в разработке!