Мне нужно предотвратить атаки 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>
Так, может кто-нибудь сказать мне, это правильный путь мне нужно идти? Если нет, то каков правильный путь?
Надеюсь, кто-нибудь может мне помочь.
Спасибо.
Прежде всего, правильный способ избежать выхода htmlentities
не htmlspecialchars
,
Избегайте ВСЕХ выводов, которые вы получаете из переменных, базы данных или пользовательского ввода.
Это почти все, что вам нужно сделать, чтобы избежать атак XSS.
Вы также можете рассмотреть возможность использования strip_tags
где это уместно.
Ну вот:
<h5>
Editing User <b><?=htmlentities($username)?></b>
(<b><?=htmlentities($email)?></b>)
</h5>
Кодировка сущности 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
htmlentities
Проверьте документацию, которую я предоставил, и эти вопросы:
htmlentities () против htmlspecialchars ()
htmlspecialchars против htmlentities при работе с XSS
и выберите тот, который подходит вам лучше всего.