Предотвратить атаки XSS при отображении переменных

Мне нужно предотвратить атаки XSS, когда я повторяю переменные в PHP.

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

$username
$email

Итак, теперь я хочу предотвратить атаку XSS, когда я использую эти переменные в своем HTML,

Я попробовал что-то вроде этого, используя htmlspecialchars()

<h5>Editing User <?php echo '"<strong>'.htmlspecialchars($username, ENT_QUOTES, 'UTF-8').'"</strong> (<strong>'; echo htmlspecialchars($email, ENT_QUOTES, 'UTF-8').'</strong>)'; ?></h5>

Это отображается HTML сверху PHP

<h5>Editing User <strong>test_user</strong> (<strong>[email protected]</strong>)</h5>

Так, может кто-нибудь сказать мне, это правильный путь мне нужно идти? Если нет, то каков правильный путь?

Надеюсь, кто-нибудь может мне помочь.
Спасибо.

0

Решение

Прежде всего, правильный способ избежать выхода htmlentitiesне htmlspecialchars,
Избегайте ВСЕХ выводов, которые вы получаете из переменных, базы данных или пользовательского ввода.
Это почти все, что вам нужно сделать, чтобы избежать атак XSS.
Вы также можете рассмотреть возможность использования strip_tags где это уместно.

Ну вот:

<h5>
Editing User <b><?=htmlentities($username)?></b>
(<b><?=htmlentities($email)?></b>)
</h5>
1

Другие решения

Кодировка сущности HTML подходит для ненадежных данных, которые вы помещаете в тело документа HTML, например внутри тега. Это даже работает для ненадежных данных, которые входят в атрибуты, особенно если вы религиозны в отношении использования кавычек вокруг ваших атрибутов. Но кодирование сущностей HTML не работает, если вы помещаете ненадежные данные в тег где-либо, или в атрибут обработчика события, например onmouseover, или в CSS, или в URL. Таким образом, даже если вы используете метод кодирования сущностей HTML везде, вы все равно, скорее всего, уязвимы для XSS. Вы ДОЛЖНЫ использовать синтаксис escape для той части HTML-документа, в которую вы помещаете ненадежные данные. Вот о чем все правила ниже.

Больше информации в OWASP.

Правильный способ использования htmlspecialchars это что-то вроде этого:

echo htmlspecialchars($string, ENT_QUOTES, 'UTF-8');

Также имейте в виду, что пользователь может отправить имя пользователя, например «Jim onclick = alert (‘hi’)»

Если вы не заключите в кавычки атрибут value, вы получите что-то вроде:

<input type="text" name="username" value=Jim onclick=alert('hi')>

ВСЕГДА используйте кавычки вокруг атрибутов. Даже если они не введены пользователем, это хорошая привычка.

<input type="text" name="username" value="<?php echo htmlspecialchars($_POST['username'], ENT_QUOTES, 'UTF-8'); ?>">

Имея это в виду, вы должны быть охвачены в большинстве случаев. Однако, если вы хотите быть действительно разборчивым, прочитайте документ OWASP, о котором я упоминал ранее, это действительно полезно.

ОБНОВИТЬ

Кажется, есть некоторые противоречия по поводу htmlspecialchars против htmlentities, Я собираюсь подвести итог нескольким вещам, которые я читал, и вы можете выбрать любой из двух:

UTF-7 проблема

И то и другое htmlspecialchars а также htmlentities чувствительны к печально известной проблеме UTF-7. Никто из них не поддерживает эту кодировку. Как вы можете прочитать в некоторых комментариях к постам SO, представленным внизу поста:

Если ваша страница / браузер уязвима для проблемы UTF-7, htmlentities
не поможет вам больше, чем htmlspecialchars будут. Оба
они будут прерывать кодировки UTF-7 < и> как просто «безопасный» ASCII
символы и передать их до конца.

Решение: Не используйте UTF-7, а также убедитесь, что экранирование выполняется с использованием той же кодировки символов, которую обслуживает документ, чтобы избежать исчезновения кавычек: установите в заголовке вашей веб-страницы ту же кодировку, что и та, которую вы будете использовать в htmlspecialchars (UTF-8 например):

header('Content-Type: text/html; charset=utf-8');

htmlspecialchars по умолчанию будет UTF-8 (в PHP 5.4 / 5.5), если вы не укажете третий параметр, поэтому вы должны быть в безопасности, даже если вы забыли его установить.

Посмотрите эту интересную статью, рассказывающую о теме (и еще немного полезной информации о XSS). ССЫЛКА НА САЙТ

htmlentities () против htmlspecialchars ()

htmlspecialchars

  • Используйте его, когда нет необходимости кодировать все символы, которые имеют свои HTML-эквиваленты, лучше использовать htmlspecialchars из-за того, что клиент отправляет меньше кода.
    Это не вопрос, который нужно воспринимать легкомысленно: меньше отправленного кода, более быстрые веб-страницы. Код также более читабелен, чем код, созданный htmlentities.
  • Иногда вы пишете данные XML, и вы не можете использовать объекты HTML в файле XML.

htmlentities

  • Когда необходимо закодировать все символы. Если ваши страницы используют кодировки, такие как ASCII или LATIN-1 вместо UTF-8.

Проверьте документацию, которую я предоставил, и эти вопросы:

htmlentities () против htmlspecialchars ()

htmlspecialchars против htmlentities при работе с XSS

и выберите тот, который подходит вам лучше всего.

1

По вопросам рекламы [email protected]