Как выводить HTML, но предотвращать атаки XSS

Я написал сценарий php для получения содержимого электронной почты.

Это содержимое в формате HTML.

Я хочу отобразить содержимое, как показано ниже.

<?php $email_content = ' <html> <script>alert("XSS");</script> <body> <div>Line1</div> <div>Line2</div> </body> </html> '; echo $email_content; ?> 

Как вы можете видеть, это вызовет атаки XSS. Но если я использую функцию htmlspecialchars, она не покажет правильный формат HTML, как я должен это делать в этом случае? Благодарю.

Solutions Collecting From Web of "Как выводить HTML, но предотвращать атаки XSS"

HTMLPurifer может это сделать:

 require_once '/path/to/HTMLPurifier.auto.php'; $config = HTMLPurifier_Config::createDefault(); $purifier = new HTMLPurifier($config); $clean_html = $purifier->purify($dirty_html); 

Это занимает грязный HTML (т. Е. Возможно, содержащий Javascript) и удаляет любой скрипт.

PHP не имеет ничего родного или встроенного, что может удалить Javacript, как HTMLPurifier. Вы можете использовать DOMDocument, но это будет длительной задачей, поскольку Javascript может выполнять некоторые атрибуты (onerror, onclick) и не ограничивается только <script></script> .

Вы должны использовать функцию strip_tags () и разрешать только теги, которые вы хотите добавить.

 echo strip_tags($text, '<p><a>'); 

Эта строка позволяет тегам <p> и <a> удалять все теги.

htmlspecialchars () работает совершенно иначе.

Из руководства :

Выполненные переводы:

  '&' (ampersand) becomes '&amp;' '"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set. "'" (single quote) becomes '&#039;' (or &apos;) only when ENT_QUOTES is set. '<' (less than) becomes '&lt;' '>' (greater than) becomes '&gt;' 

Существует очень хорошая статья о предотвращении XSS и prvenvetion CSRF .