Функция esc_sql()
в WordPress предназначена для экранирования строк и массивов перед использованием их в SQL-запросах, чтобы предотвратить SQL-инъекции. Это важный инструмент для защиты данных, обрабатывающий входные значения, которые будут добавлены в запросы.
esc_sql( string|array $data ): string|array
Функция принимает строку или массив строк и возвращает экранированный вариант, который можно безопасно использовать в SQL-запросе. Для очистки текста используется функция addslashes()
, обеспечивающая защиту от SQL-инъекций.
Параметры
$data
(строка | массив, обязательный): Неочищенные данные, которые будут использоваться в SQL-запросе.
Возвращаемое значение
- Возвращает экранированную строку или массив строк (в зависимости от входного значения).
Рекомендации по использованию
Хотя esc_sql()
может быть полезна для единичного экранирования, рекомендуется использовать $wpdb->prepare()
для подготовки запросов, поскольку этот метод также корректирует ошибки форматирования.
Простой пример экранирования строки
<?php
$user_input = 'Новая "запись" с символами';
$safe_input = esc_sql($user_input);
echo $safe_input;
?>
Результат:
Новая \"запись\" с символами
В этом примере строка экранируется, и специальные символы не будут нарушать SQL-запрос.
Использование esc_sql()
с массивом данных
<?php
$names = ['User "A"', 'User \'B\'', 'User <C>'];
$safe_names = esc_sql($names);
print_r($safe_names);
?>
Результат:
Array
(
[0] => User \"A\"
[1] => User \'B\'
[2] => User <C>
)
Здесь каждый элемент массива экранируется, что делает их безопасными для использования в запросах с конструкцией IN
.
Пример экранирования строк для SQL-запроса
<?php
global $wpdb;
$name = esc_sql('Имя_пользователя');
$status = esc_sql('активен');
$query = "SELECT * FROM wp_users WHERE user_name = '$name' AND status = '$status'";
$result = $wpdb->get_results($query);
?>
Этот пример показывает безопасное использование переменных в SQL-запросе. Однако предпочтительнее было бы использовать $wpdb->prepare()
для дополнительной безопасности.
Использование $wpdb->prepare()
как альтернативы
<?php
global $wpdb;
$name = 'Имя_пользователя';
$status = 'активен';
$query = $wpdb->prepare("SELECT * FROM wp_users WHERE user_name = %s AND status = %s", $name, $status);
$result = $wpdb->get_results($query);
?>
В отличие от esc_sql()
, этот метод также корректирует форматирование и снижает вероятность ошибок, делая его предпочтительным выбором.
Использование в сложных запросах с массивом в операторе IN
<?php
global $wpdb;
$user_ids = [3, 7, 12];
$safe_ids = implode(",", array_map('esc_sql', $user_ids));
$query = "SELECT * FROM wp_users WHERE ID IN ($safe_ids)";
$results = $wpdb->get_results($query);
?>
Здесь esc_sql()
экранирует массив перед добавлением в IN
запрос, обеспечивая безопасность.
Важные замечания
esc_sql()
полезна при необходимости экранирования одиночных значений. Для более сложных запросов и значений, которые вставляются в SQL-запросы, предпочтительно использовать$wpdb->prepare()
.- Функция экранирует только значения, заключенные в кавычки, а не числовые значения или ключевые слова SQL, что требует особой осторожности при её использовании.
Заключение
Функция esc_sql()
в WordPress помогает предотвратить SQL-инъекции и защитить данные.