Санитизация параметров URL в get_query_var()
В настоящее время я работаю над сайтом и тестирую его безопасность. На одной из страниц есть функция сортировки, где я передаю параметр URL для указания способа сортировки контента.
Например:
www.example.com/page/?sort=alpha
Это работает нормально, но я также попытался отправить вредоносный код:
www.example.com/page/?sort=alpha%3Cimg+src=xyz+onerror=alert(99)%3E%3Cxss/%3E
В Internet Explorer при вводе этого URL моя страница отображается и появляется JavaScript-алерт, таким образом мне удалось выполнить некоторый код на странице. В Chrome я получаю сообщение о том, что XSS-аудитор заблокировал это выполнение, но я бы предпочел, чтобы такие попытки даже не предпринимались. Насколько я вижу, этот параметр принимается в моем файле header.php
в строке Sort : <?= get_query_var('sort') ?>
.
Я хочу санитизировать этот ввод, чтобы он никогда не выполнял подобные скрипты. Как я могу это сделать?

Между заголовком вашего вопроса и его содержимым есть небольшое несоответствие.
Похоже, вы используете плагин (или разрабатываете плагин?), который позволяет выполнять сортировку на фронтэнде. Если вы используете плагин и параметр строки запроса не санируется, вам необходимо уведомить разработчика этого плагина, потому что это проблема безопасности.
Исправление проблемы самостоятельно может временно решить её, но вам не следует редактировать плагины напрямую (даже плохо написанные), так как это поставит вас в неудобное положение, когда изменения придется повторно применять после обновления плагина.
Название функции get_query_var()
может вводить в заблуждение. Многие рассматривают её как удобную замену $_GET[]
в WordPress, но это не так. get_query_var()
работает ТОЛЬКО с переменными, которые являются частью глобального запроса WordPress. Это включает стандартные переменные WordPress и любые пользовательские переменные (добавленные с помощью set_query_var()
).
Плагин, который применяет пользовательские правила перезаписи URL для своих конечных точек, может быть примером этого. Но если вы думаете, что можете использовать эту функцию для получения любой переменной из URL, это не сработает, потому что get_query_var()
не предназначена для этого.
Вам нужно найти место, где собирается этот параметр запроса. Скорее всего, это делается с помощью $_GET['sort']
.
В любом случае, это должно выглядеть так:
$some_var = sanitize_text_field( $_GET['sort'] );
Или ещё лучше:
$some_var = ( isset( $_GET['sort'] ) ) ? sanitize_text_field( $_GET['sort'] ) : 'значение по умолчанию';
Конечно, я отвечаю на основе предположений, так как в вашем вопросе не хватает деталей. Если я ошибся, дополните вопрос более подробной информацией, и я внесу соответствующие изменения.
