Просто обратите внимание, что это не решит ситуацию, когда вы захотите использовать пользовательский ввод в качестве атрибута HTML. Например, исходный URL изображения. Не обычный случай, но легко забываемый.
Там хорошая статья здесь , что объясняет XSS и как предотвратить его на разных языках ( в том числе. PHP).
XCore
Ответы:
296
В основном вам нужно использовать эту функцию htmlspecialchars()всякий раз, когда вы хотите вывести в браузер что-то, полученное из пользовательского ввода.
Правильный способ использования этой функции примерно такой:
@TimTim: В большинстве случаев, да. Однако, когда вам нужно разрешить ввод HTML, все становится немного сложнее, и если это так, я рекомендую использовать что-то вроде htmlpurifier.org
Alix Axel
@Alix Аксель, так ли ваш ответ использовать htmlspecialchars или htmlpurifier.org ?
TimTim
3
Если вам нужно принять ввод HTML, используйте HTML Purifier, если не используете htmlspecialchars().
В большинстве случаев это правильно, но не так просто. Вы должны подумать о том, чтобы поместить ненадежную строку в HTML, Js, Css, и подумать о том, чтобы поместить ненадежный HTML в HTML. Посмотрите на это: owasp.org/index.php/…
бронзовый человек
41
Одной из моих любимых ссылок на OWASP является объяснение межсайтовых сценариев, поскольку, хотя существует большое количество векторов атак XSS, соблюдение следующих нескольких правил может в значительной степени защитить от большинства из них!
Одним из наиболее важных шагов является очистка любого пользовательского ввода перед его обработкой и / или обработкой в браузере. PHP имеет некоторые функции « фильтра », которые можно использовать.
Форма, которую обычно используют атаки XSS, - это вставить ссылку на некоторый сторонний javascript, который содержит злонамеренные намерения для пользователя. Подробнее об этом читайте здесь .
Вы также захотите протестировать свой сайт - я могу порекомендовать дополнение Firefox XSS Me .
Что мне нужно, чтобы убедиться, что я очищаю вход именно от. Есть ли какой-то конкретный символ / строка, на которую я должен обратить внимание?
TimTim
27
@TimTim - нет. Все вводимые пользователем , должны всегда рассматриваться как по своей сути враждебные.
зомбат
Кроме того, внутренние данные (сотрудники, системный администратор и т. Д.) Могут быть небезопасными. Вы должны идентифицировать и контролировать (с датой регистрации и пользователем) данные, отображаемые с интерпретацией.
Самуэль Даузон,
9
В порядке предпочтения:
Если вы используете шаблонизатор (например, Twig, Smarty, Blade), убедитесь, что он предлагает контекстно-зависимое экранирование. По своему опыту я знаю, что это делает Твиг.{{ var|e('html_attr') }}
Если вы хотите разрешить HTML, используйте HTML Purifier . Даже если вы думаете, что принимаете только Markdown или ReStructuredText, вы все равно хотите очистить HTML от этих языков разметки.
В противном случае используйте htmlentities($var, ENT_QUOTES | ENT_HTML5, $charset)и убедитесь, что в остальной части документа используется тот же набор символов, что и $charset. В большинстве случаев 'UTF-8'это желаемый набор символов.
Перекрестная публикация этого как сводная ссылка от бета-версии документации SO, которая выходит в автономном режиме.
проблема
Межсайтовый скриптинг - это непреднамеренное выполнение удаленного кода веб-клиентом. Любое веб-приложение может представить себя XSS, если оно принимает данные от пользователя и выводит их непосредственно на веб-странице. Если ввод включает HTML или JavaScript, удаленный код может быть выполнен, когда этот контент отображается веб-клиентом.
Например, если сторонняя сторона содержит файл JavaScript:
Будет запущен сторонний JavaScript, и пользователь увидит «Я бегу» на веб-странице.
Решение
Как правило, никогда не доверяйте данным, поступающим от клиента. Каждое значение GET, POST и cookie может быть чем угодно, и поэтому должно быть проверено. При выводе любого из этих значений избегайте их, чтобы они не оценивались неожиданным образом.
Имейте в виду, что даже в самых простых приложениях данные могут перемещаться, и будет сложно отслеживать все источники. Поэтому лучше всегда избегать вывода.
PHP предоставляет несколько способов избежать вывода в зависимости от контекста.
htmlspecialcharsпреобразует любые «специальные символы HTML» в свои HTML-кодировки, то есть они не будут обрабатываться как стандартный HTML. Чтобы исправить наш предыдущий пример, используя этот метод:
<?php
echo '<div>'. htmlspecialchars($_GET['input']).'</div>';// or
echo '<div>'. filter_input(INPUT_GET,'input', FILTER_SANITIZE_SPECIAL_CHARS).'</div>';
При выводе динамически сгенерированного URL-адреса PHP предоставляет urlencodeфункцию для безопасного вывода действительных URL-адресов. Так, например, если пользователь может вводить данные, которые становятся частью другого параметра GET:
Любой вредоносный ввод будет преобразован в закодированный параметр URL.
Использование специализированных внешних библиотек или списков OWASP AntiSamy
Иногда вам захочется отправить HTML или другой вид ввода кода. Вам нужно будет вести список разрешенных слов (белый список) и неавторизованных (черный список).
Вы можете скачать стандартные списки, доступные на веб-сайте OWASP AntiSamy . Каждый список подходит для определенного вида взаимодействия (ebay api, tinyMCE и т. Д.). И это с открытым исходным кодом.
Существуют библиотеки для фильтрации HTML и предотвращения XSS-атак в общем случае и выполнения по крайней мере так же, как списки AntiSamy с очень простым использованием. Например, у вас есть очиститель HTML
Многие фреймворки помогают обрабатывать XSS различными способами. При развертывании собственного или если есть какая-то проблема XSS, мы можем использовать filter_input_array (доступно в PHP 5> = 5.2.0, PHP 7.) Я обычно добавляю этот фрагмент в мой SessionController, потому что все вызовы проходят там до любого другого контроллера взаимодействует с данными. Таким образом, весь ввод пользователя очищается в 1 центральном месте. Если это делается в начале проекта или до того, как ваша база данных отравлена, у вас не должно быть проблем во время вывода ... останавливает мусор, выкидывает мусор.
/* Prevent XSS input */
$_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);
$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);/* I prefer not to use $_REQUEST...but for those who do: */
$_REQUEST =(array)$_POST +(array)$_GET +(array)$_REQUEST;
Выше будет удалено ВСЕ HTML и теги скрипта. Если вам нужно решение, которое позволяет использовать безопасные теги на основе белого списка, ознакомьтесь с HTML Purifier .
Если ваша база данных уже заражена или вы хотите работать с XSS во время вывода, OWASP рекомендует создать пользовательскую функцию-обертку echoи использовать ее ВЕЗДЕ, где вы выводите пользовательские значения:
Вы также можете установить некоторые связанные с XSS заголовки ответа HTTP через header(...)
X-XSS-Protection "1; mode = block"
чтобы быть уверенным, режим защиты XSS браузера включен.
Политика безопасности содержимого "default-src 'self'; ..."
включить защиту содержимого на стороне браузера. См. Этот для деталей Политики безопасности контента (CSP): http://content-security-policy.com/
Особую настройку CSP для блокировки встроенных сценариев и внешних источников сценариев полезно использовать в XSS.
Также, очевидно, старайтесь избегать eval(var), если вам нужно использовать какой-либо из них, попробуйте JS, избегая их, HTML избегайте их, и вам, возможно, придется сделать еще кое-что, но для основы этого должно быть достаточно.
href
илиsrc
HTML: stackoverflow.com/questions/19047119/…Ответы:
В основном вам нужно использовать эту функцию
htmlspecialchars()
всякий раз, когда вы хотите вывести в браузер что-то, полученное из пользовательского ввода.Правильный способ использования этой функции примерно такой:
В Университете Google Code также есть эти обучающие видео по веб-безопасности:
Как взломать веб-программное обеспечение - взгляд на уязвимости безопасности в веб-программах
Что каждый инженер должен знать о безопасности и где ее изучать
источник
htmlspecialchars()
.Одной из моих любимых ссылок на OWASP является объяснение межсайтовых сценариев, поскольку, хотя существует большое количество векторов атак XSS, соблюдение следующих нескольких правил может в значительной степени защитить от большинства из них!
Это PHP безопасности шпаргалка
источник
Одним из наиболее важных шагов является очистка любого пользовательского ввода перед его обработкой и / или обработкой в браузере. PHP имеет некоторые функции « фильтра », которые можно использовать.
Форма, которую обычно используют атаки XSS, - это вставить ссылку на некоторый сторонний javascript, который содержит злонамеренные намерения для пользователя. Подробнее об этом читайте здесь .
Вы также захотите протестировать свой сайт - я могу порекомендовать дополнение Firefox XSS Me .
источник
В порядке предпочтения:
{{ var|e('html_attr') }}
htmlentities($var, ENT_QUOTES | ENT_HTML5, $charset)
и убедитесь, что в остальной части документа используется тот же набор символов, что и$charset
. В большинстве случаев'UTF-8'
это желаемый набор символов.Также убедитесь, что вы сбежали на выходе, а не на входе .
источник
Перекрестная публикация этого как сводная ссылка от бета-версии документации SO, которая выходит в автономном режиме.
проблема
Межсайтовый скриптинг - это непреднамеренное выполнение удаленного кода веб-клиентом. Любое веб-приложение может представить себя XSS, если оно принимает данные от пользователя и выводит их непосредственно на веб-странице. Если ввод включает HTML или JavaScript, удаленный код может быть выполнен, когда этот контент отображается веб-клиентом.
Например, если сторонняя сторона содержит файл JavaScript:
И приложение PHP напрямую выводит строку, переданную в него:
Если непроверенный параметр GET содержится,
<script src="http://example.com/runme.js"></script>
то вывод сценария PHP будет:Будет запущен сторонний JavaScript, и пользователь увидит «Я бегу» на веб-странице.
Решение
Как правило, никогда не доверяйте данным, поступающим от клиента. Каждое значение GET, POST и cookie может быть чем угодно, и поэтому должно быть проверено. При выводе любого из этих значений избегайте их, чтобы они не оценивались неожиданным образом.
Имейте в виду, что даже в самых простых приложениях данные могут перемещаться, и будет сложно отслеживать все источники. Поэтому лучше всегда избегать вывода.
PHP предоставляет несколько способов избежать вывода в зависимости от контекста.
Функции фильтра
ПГПС Функции фильтрации позволяют входные данные в PHP скрипт , чтобы быть продезинфицировать или подтверждено в многих отношениях . Они полезны при сохранении или выводе клиентского ввода.
HTML кодировка
htmlspecialchars
преобразует любые «специальные символы HTML» в свои HTML-кодировки, то есть они не будут обрабатываться как стандартный HTML. Чтобы исправить наш предыдущий пример, используя этот метод:Будет вывод:
Все внутри
<div>
тега не будет интерпретироваться браузером как тег JavaScript, а как простой текстовый узел. Пользователь безопасно увидит:Кодировка URL
При выводе динамически сгенерированного URL-адреса PHP предоставляет
urlencode
функцию для безопасного вывода действительных URL-адресов. Так, например, если пользователь может вводить данные, которые становятся частью другого параметра GET:Любой вредоносный ввод будет преобразован в закодированный параметр URL.
Использование специализированных внешних библиотек или списков OWASP AntiSamy
Иногда вам захочется отправить HTML или другой вид ввода кода. Вам нужно будет вести список разрешенных слов (белый список) и неавторизованных (черный список).
Вы можете скачать стандартные списки, доступные на веб-сайте OWASP AntiSamy . Каждый список подходит для определенного вида взаимодействия (ebay api, tinyMCE и т. Д.). И это с открытым исходным кодом.
Существуют библиотеки для фильтрации HTML и предотвращения XSS-атак в общем случае и выполнения по крайней мере так же, как списки AntiSamy с очень простым использованием. Например, у вас есть очиститель HTML
источник
Многие фреймворки помогают обрабатывать XSS различными способами. При развертывании собственного или если есть какая-то проблема XSS, мы можем использовать filter_input_array (доступно в PHP 5> = 5.2.0, PHP 7.) Я обычно добавляю этот фрагмент в мой SessionController, потому что все вызовы проходят там до любого другого контроллера взаимодействует с данными. Таким образом, весь ввод пользователя очищается в 1 центральном месте. Если это делается в начале проекта или до того, как ваша база данных отравлена, у вас не должно быть проблем во время вывода ... останавливает мусор, выкидывает мусор.
Выше будет удалено ВСЕ HTML и теги скрипта. Если вам нужно решение, которое позволяет использовать безопасные теги на основе белого списка, ознакомьтесь с HTML Purifier .
Если ваша база данных уже заражена или вы хотите работать с XSS во время вывода, OWASP рекомендует создать пользовательскую функцию-обертку
echo
и использовать ее ВЕЗДЕ, где вы выводите пользовательские значения:источник
Вы также можете установить некоторые связанные с XSS заголовки ответа HTTP через
header(...)
чтобы быть уверенным, режим защиты XSS браузера включен.
включить защиту содержимого на стороне браузера. См. Этот для деталей Политики безопасности контента (CSP): http://content-security-policy.com/ Особую настройку CSP для блокировки встроенных сценариев и внешних источников сценариев полезно использовать в XSS.
для общего набора полезных заголовков HTTP-ответов, касающихся безопасности вашего веб-приложения, обратитесь к OWASP: https://www.owasp.org/index.php/List_of_useful_HTTP_headers.
источник
источник
preg_replace
как он используетeval
на вашем входе. owasp.org/index.php/PHP_Security_Cheat_Sheet#Code_InjectionИспользуйте
htmlspecialchars
наPHP
. В HTML старайтесь не использовать:element.innerHTML = “…”; element.outerHTML = “…”; document.write(…); document.writeln(…);
где
var
находится управляется пользователем .Также, очевидно, старайтесь избегать
eval(var)
, если вам нужно использовать какой-либо из них, попробуйте JS, избегая их, HTML избегайте их, и вам, возможно, придется сделать еще кое-что, но для основы этого должно быть достаточно.источник
Лучший способ защитить ваш ввод - это использовать
htmlentities
функцию. Пример:Вы можете получить больше информации здесь .
источник