Функция sanitize_sql_orderby()
в WordPress используется для проверки и валидации строки, которая будет применена в разделе ORDER BY
SQL-запроса. Эта функция предотвращает SQL-инъекции, проверяя, чтобы в строке содержались только допустимые значения, такие как имена столбцов и направления сортировки (ASC
или DESC
).
sanitize_sql_orderby( string $orderby ): string|false
Параметры
$orderby
(строка, обязательный): строка с условиями сортировки для проверки, например,column_name ASC
илиRAND()
.
Возвращаемое значение
- Возвращает строку
$orderby
, если она прошла проверку, иfalse
в случае, если строка содержит недопустимые значения.
Простой пример с проверкой сортировки
<?php
$orderby = 'column_name DESC';
$safe_orderby = sanitize_sql_orderby($orderby);
if ($safe_orderby !== false) {
$query = "SELECT * FROM wp_posts ORDER BY $safe_orderby";
// Выполнение запроса с помощью $wpdb
} else {
echo 'Недопустимая строка ORDER BY';
}
?>
Здесь проверяется строка column_name DESC
, которая пройдет проверку, и результат будет безопасно использован в запросе.
Проверка на случайную сортировку с использованием RAND()
<?php
$orderby = 'RAND()';
$safe_orderby = sanitize_sql_orderby($orderby);
if ($safe_orderby !== false) {
$query = "SELECT * FROM wp_posts ORDER BY $safe_orderby";
} else {
echo 'Строка ORDER BY недопустима';
}
?>
Функция позволяет использовать RAND()
для случайной сортировки результатов. Если строка пройдет проверку, она будет добавлена к SQL-запросу.
Сложный пример с несколькими столбцами и разными направлениями сортировки
<?php
$orderby = 'date_created DESC, author_name ASC';
$safe_orderby = sanitize_sql_orderby($orderby);
if ($safe_orderby !== false) {
$query = "SELECT * FROM wp_posts ORDER BY $safe_orderby";
// Пример использования запроса в WordPress
} else {
echo 'Недопустимая строка ORDER BY';
}
?>
В этом примере sanitize_sql_orderby()
проверяет строку с сортировкой по нескольким столбцам. Валидация пройдет успешно, так как используются только допустимые значения.
Пример неправильного использования с недопустимым синтаксисом
<?php
$orderby = 'column_name; DROP TABLE wp_users';
$safe_orderby = sanitize_sql_orderby($orderby);
if ($safe_orderby === false) {
echo 'Недопустимая строка ORDER BY — возможна SQL-инъекция!';
}
?>
Здесь функция обнаружит потенциальную SQL-инъекцию и вернет false
, предотвращая выполнение опасного запроса.
Включение в условный запрос с проверкой значений
<?php
global $wpdb;
$allowed_columns = ['post_date', 'post_author', 'post_title'];
$orderby_column = 'post_date';
$direction = 'ASC';
if (in_array($orderby_column, $allowed_columns, true)) {
$orderby = sanitize_sql_orderby("$orderby_column $direction");
if ($orderby) {
$query = "SELECT * FROM wp_posts ORDER BY $orderby";
$results = $wpdb->get_results($query);
}
} else {
echo 'Ошибка: недопустимый столбец для сортировки';
}
?>
Этот пример показывает, как безопасно использовать пользовательские значения для сортировки, проверяя их на соответствие допустимым столбцам и значениям.
Важные замечания
sanitize_sql_orderby()
полезна для предотвращения SQL-инъекций в строкахORDER BY
, но она работает только с корректными строковыми значениями и не проверяет другие части запроса.- Поддерживает сортировку по нескольким столбцам и по случайному значению
RAND()
. - Рекомендуется проверять пользовательские значения на уровне приложения перед их использованием в запросе.
Заключение
Функция sanitize_sql_orderby()
в WordPress предназначена для безопасной работы с SQL-запросами, предотвращая SQL-инъекции в ORDER BY
запросах.