Санитизация параметров URL в get_query_var()

26 окт. 2019 г., 11:45:10
Просмотры: 13.9K
Голосов: 5

В настоящее время я работаю над сайтом и тестирую его безопасность. На одной из страниц есть функция сортировки, где я передаю параметр 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') ?>.

Я хочу санитизировать этот ввод, чтобы он никогда не выполнял подобные скрипты. Как я могу это сделать?

1
Комментарии

Похоже, что сортировка связана с используемым вами плагином? Если да, то лучший способ решить эту проблему — сообщить разработчику о найденной уязвимости и необходимости её устранения.

butlerblog butlerblog
27 окт. 2019 г. 01:59:40
Все ответы на вопрос 1
2

Между заголовком вашего вопроса и его содержимым есть небольшое несоответствие.

Похоже, вы используете плагин (или разрабатываете плагин?), который позволяет выполнять сортировку на фронтэнде. Если вы используете плагин и параметр строки запроса не санируется, вам необходимо уведомить разработчика этого плагина, потому что это проблема безопасности.

Исправление проблемы самостоятельно может временно решить её, но вам не следует редактировать плагины напрямую (даже плохо написанные), так как это поставит вас в неудобное положение, когда изменения придется повторно применять после обновления плагина.

Название функции 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'] ) : 'значение по умолчанию';

Конечно, я отвечаю на основе предположений, так как в вашем вопросе не хватает деталей. Если я ошибся, дополните вопрос более подробной информацией, и я внесу соответствующие изменения.

27 окт. 2019 г. 20:41:58
Комментарии

Огромное спасибо, это работает!

user2924127 user2924127
28 окт. 2019 г. 00:12:40

Рад слышать, что это сработало для вас. Хочу подчеркнуть - если это в плагине, который вы используете, сообщите об этом разработчику, чтобы он мог исправить уязвимость.

butlerblog butlerblog
28 окт. 2019 г. 23:46:46