| @copyright 2007-2026 (c) AVE.cms
| @link https://ave-cms.ru
| @version 3.3
*/
namespace App\Helpers;
if (! defined("BASEPATH"))
{
die ('Direct access to this location is not allowed.');
}
class Secure
{
/**
* Конструктор класса Secure
*
* @return void
*/
protected function __construct()
{
//--
}
/**
* Декодирует HTML-сущности и убирает слеши из строки
*
* Метод используется для очистки строк от HTML-сущностей и лишних слэшей,
* что помогает предотвратить возможные уязвимости при обработке данных.
*
* @param string $string Входная строка для очистки
* @return string Очищенная строка
*
* @example
*
* Secure::cleanOut('');
* // Результат: ''
*
*/
public static function cleanOut ($string)
{
$string = html_entity_decode($string, ENT_QUOTES, 'UTF-8');
return stripslashes($string);
}
/**
* Очищает строку от потенциально опасных символов
*
* Метод применяет фильтрацию строки для удаления HTML-тегов,
* специальных символов и других потенциально опасных элементов.
* Может использоваться для очистки пользовательского ввода перед сохранением в базу данных.
*
* @param string $string Входная строка для очистки
* @param bool|int $trim Флаг обрезки строки или максимальная длина строки
* @return string Очищенная строка
*
* @example
*
* Secure::sanitize('', true);
* // Результат: 'alertXSS'
*
*/
public static function sanitize ($string, $trim = false)
{
$string = filter_var($string, FILTER_SANITIZE_STRING);
$string = trim($string);
$string = stripslashes($string);
$string = strip_tags($string);
$string = str_replace(
[
'‘',
'’',
'“',
'”'
],
[
"'",
"'",
'"',
'"'
],
$string
);
if ($trim)
{
$string = substr($string, 0, $trim);
}
if (is_numeric($string))
{
$string = filter_var($string, FILTER_VALIDATE_INT);
}
return $string;
}
/**
* Очищает строку и обрезает её при необходимости
*
* Метод объединяет функции cleanOut и sanitize с возможностью обрезки строки
* до заданной длины с добавлением символа окончания.
* Используется для подготовки текстовых данных к отображению с ограничением длины.
*
* @param string $string Входная строка для очистки
* @param bool|int $trim Максимальная длина строки или флаг обрезки
* @param string $end_char Символ, добавляемый в конце обрезанной строки
* @return string Очищенная и при необходимости обрезанная строка
*
* @example
*
* Secure::cleanSanitize('Very long text that needs to be truncated', 10, '...');
* // Результат: 'Very long...'
*
*/
public static function cleanSanitize ($string, $trim = false, $end_char = '…')
{
$string = self::cleanOut($string);
$string = filter_var($string, FILTER_SANITIZE_STRING);
$string = trim($string);
$string = stripslashes($string);
$string = strip_tags($string);
$string = str_replace(
[
'‘',
'’',
'“',
'”'],
[
"'",
"'",
'"',
'"'
],
$string);
if ($trim)
{
if (strlen($string) < $trim)
{
return $string;
}
$string = preg_replace("/\s+/", ' ', str_replace(array(
"\r\n",
"\r",
"\n"), ' ', $string));
if (strlen($string) <= $trim)
{
return $string;
}
$out = '';
foreach (explode(' ', trim($string)) as $val)
{
$out .= $val . ' ';
if (strlen($out) >= $trim)
{
$out = trim($out);
return (strlen($out) == strlen($string))
? $out
: $out . $end_char;
}
}
}
return $string;
}
/**
* Защищает массив от XSS-атак
*
* Метод применяет защиту от XSS для всех элементов массива,
* рекурсивно обрабатывая вложенные массивы. Используется для
* безопасной обработки пользовательских данных из GET/POST запросов.
*
* @param array $array Массив параметров для защиты
* @param bool $stripslashes Флаг удаления слэшей из строк
* @return array Защищённый массив параметров
*
* @example
*
* $data = ['name' => '', 'email' => 'test@example.com'];
* Secure::arrayXss($data);
* // Результат: ['name' => '', 'email' => 'test@example.com']
*
*/
public static function arrayXss ($array, $stripslashes = false)
{
$filter = array('<', '>');
foreach ($array as $key => $xss)
{
if (is_array($xss))
{
$array[$key] = self::arrayXss($xss, $stripslashes);
}
else
{
if ($stripslashes)
$xss = stripslashes($xss);
$xss = htmlspecialchars_decode($xss);
$xss = str_replace('"', '"', $xss);
$array[$key] = str_replace($filter, array('<', '>'), trim($xss));
}
}
return $array;
}
/**
* Восстанавливает строку после защиты от XSS
*
* Метод восстанавливает оригинальные символы, которые были заменены
* при защите от XSS-атак. Используется для отображения данных,
* которые были ранее защищены методом arrayXss().
*
* @param string $string Входная строка для восстановления
* @return string Восстановленная строка
*
* @example
*
* $safe_string = Secure::arrayXss(['name' => '']);
* Secure::decodeXss($safe_string['name']);
* // Результат: ''
*
*/
public static function decodeXss ($string)
{
return str_replace(['<', '>', '"'], ['<', '>', '"'], trim($string));
}
/**
* Очищает и нормализует номер телефона
*
* Метод удаляет все символы, кроме цифр, из номера телефона,
* а также обрабатывает международные и российские форматы номеров.
* Возвращает последние 10 цифр номера телефона.
*
* @param string $phone Номер телефона для очистки
* @return string Очищенный номер телефона (последние 10 цифр)
*
* @example
*
* Secure::sanitizePhoneNumber('+7 (999) 123-45-67');
* // Результат: '9991234567'
*
*/
public static function sanitizePhoneNumber($phone)
{
$phone = preg_replace('/^\+\s*[0-9]{1,4}\s+/', '', $phone);
$phone = preg_replace('/^8\s{1,}\(/', '', $phone);
$phone = preg_replace('/[^0-9]/', '', $phone);
return substr($phone, -10);
}
protected function __clone ()
{
//
}
protected function __wakeup ()
{
//
}
}