Является ли $ _SERVER безопасным для XSS?

Мне нужно создать форму, действие которой возвращает вас к той же самой странице – включены параметры GET. Я думаю, что могу сказать что-то вроде:

echo '<form action="'.$_SERVER['SCRIPT_NAME'].'?'.$_SERVER['QUERY_STRING']. '" method="post">' 

Кажется, что это работает, и тестирование прохождения пары XSS-атак кажется успешным, поскольку вывод QUERY_STRING, похоже, кодируется URL. Однако в документации PHP это не упоминается, поэтому я не уверен, что могу доверять этому поведению.

Можно ли использовать QUERY_STRING так, как я выше? Если нет, что я могу сделать вместо этого? Будут оценены ссылки на документацию.

Обновление переключилось на SCRIPT_NAME, просто перепуталось, какой из них был в порядке, и что было плохо в моей голове, спасибо, что поймал меня. action="" отлично справляется с моей конкретной проблемой, но мне все еще интересно, если QUERY_STRING предварительно обработана, поэтому ее можно использовать безопасно или нет, поскольку есть другие случаи, когда вы захотите повторно использовать строку запроса, полагая, что это безопасный для этого.

Вы никогда не должны доверять $ _SERVER ['QUERY_STRING'], поскольку он может использоваться для атак XSS.

В вашем случае можно использовать уязвимость с помощью:

 http://your.server.com/your_script.php?"><script>alert(111);</script> 

Обратите внимание, что приведенный выше код работает в IE; FireFox и Chrome эффективно кодируют строку запроса перед отправкой на веб-сервер.

Я бы всегда обернул его htmlentities (вспомните параметр double_encode), как и при каждом вводе пользователя.

Удачи!

Если он используется XSS, сначала вам нужно знать, какая атака. В приведенном здесь коде есть только одна простая атака с использованием PHP_SELF.

Но, чтобы избежать каких-либо проблем, вы можете просто оставить действие формы пустым. Это отправит форму на ту же страницу, включая строку запроса.

Прежде всего, вы не можете доверять $ _SERVER ['PHP_SELF'] ( 1 ) – вместо этого используйте $ _SERVER ['SCRIPT_NAME'].

Что касается $ _SERVER ['QUERY_STRING'], вы должны рассматривать его как любой другой пользовательский ввод. Отфильтруйте его перед использованием в своем выходе. В этом случае я бы не рекомендовал какой-то общий фильтр. Было бы лучше собрать строку запроса из определенных частей, которые вы ожидаете там.

Я не могу думать о каких-либо атаках, которые могли бы работать вне руки, но сам PHP_SELF уязвим, и вы используете QUERY_STRING без какой-либо фильтрации, что кажется странным.

Почему бы просто не оставить параметр action пустым и позволить браузеру решить? Вы можете использовать Javascript для правильного применения этого поведения на стороне клиента, если хотите быть уверенным.