#php #security
#php #Безопасность
Вопрос:
Я использую echo $_SERVER['REQUEST_URI'];
для вывода частей HTML-формы пользователю.
Меня беспокоит потенциальная атака с использованием межсайтовых скриптов, когда на страницу может быть введена ссылка на файл JavaScript вне сайта. Однако я не могу отфильтровать «=» в своих выходных данных, потому что это соответствующая часть моей строки запроса. Может ли фильтрация выходных данных со знаками равенства быть достаточной для предотвращения атаки CSS? Или это просто плохая практика (использование сгенерированных пользователем строк запроса GET в форме)?
Вот потенциальная уязвимость:
//Attacker types this into the browser:
vulnerabilesite.com/=query=?querystringhere/?<script type="text/javascript">
maliciouswebsite.com/js.js</script>
//People viewing the website using that link will now execute the following code:
<script type="text/javascript"> /link-to-malicious-javascript </script>
Комментарии:
1. Вы отметили свой вопрос тегом
javascript
, но из вашегоecho $_SERVER['REQUEST_URI'];
он гораздо больше похож на вопрос PHP. Я обновил теги.2. Как вы используете
$_SERVER['REQUEST_URI']
? Просто как обычный текст? Или атрибут элемента?3. Я использую его как
option value="$_SERVER['REQUEST_URI'];"
атрибут в форме.
Ответ №1:
Используйте следующий htmlspecialchars
вызов для безопасного экранирования $_SERVER['REQUEST_URI']
содержимого и атрибутов, даже если вы используете одинарные кавычки для своих атрибутов HTML. При использовании кодировки, отличной от UTF-8, убедитесь, что вы заменили правильную кодировку.
echo htmlspecialchars( $_SERVER['REQUEST_URI'], ENT_QUOTES, 'UTF-8' );
Это тот же код, который используется html_escape
функцией во фреймворке CodeIgniter.
Альтернативно:
echo htmlspecialchars( $_SERVER['REQUEST_URI'], ENT_QUOTES | ENT_HTML5, 'UTF-8' );
Комментарии:
1. Это работает для выводимого HTML, но поскольку оно экранирует строку моего запроса, это нарушает работу моего приложения. Достаточно ли
strip_tags()
одного?2.
strip_tags()
этого недостаточно, вы все еще могли бы сделать" onmouseover="BADJS" "
. Это не должно нарушать вашу строку запроса. Можете ли вы предоставить пример ввода, который вызывает проблемы?3.
function eliminator ($URI) { /*$URI = htmlspecialchars($URI, ENT_QUOTES);*/ $array = array ("amp;Sort=Date", "amp;Sort=Pic", "amp;Sort=Highest", "amp;Sort=Lowest"); return str_replace($array, "", $URI); }
У меня есть следующая функция, которая работает только тогда, когда htmlspecialchars закомментирован. Не уверен, почему это так.4. Сделайте
str_replace
передhtmlspecialchars
.htmlspecialchars
должно быть выполнено непосредственно перед выводом содержимого, после других манипуляций со строками.function eliminator ($URI) { $array = array ("amp;Sort=Date", "amp;Sort=Pic", "amp;Sort=Highest", "amp;Sort=Lowest"); $URI = str_replace($array, "", $URI); return htmlspecialchars($URI, ENT_QUOTES); }
.