2016-06-03 4 views
2

Я читаю здесь:
https://stackoverflow.com/a/8932454/4301970
что htmlspecialchars() очень эффективно предотвращает атаки xss.Как отобразить htmlspecialchars на html?

Я получаю отформатированный текст с WYSIWYG редактор, например:

<p> 
    <em> 
     <strong><span style="font-size:36pt;">test</span></strong> 
    </em> 
</p> 

Кодирование это на мой HTML:

<!DOCTYPE html> 
<html lang=en> 
<head> 
    <title></title> 
</head> 
<body> 
<?php echo htmlspecialchars('<p><em><strong><span style="font-size:36pt;">test</span></strong></em></p>', ENT_QUOTES); ?> 
</body> 
</html> 

Выведет в браузере:

<p><em><strong><span style="font-size:36pt;">test</span></strong></em></p> 

Как я могу правильно отобразить форматированный текст, не допуская при этом инъекций XSS?

+0

Вы можете использовать \ п после элемента новой строки и \ т для Tab. –

+0

'nl2br (str_replace (" "," $ nbsp; "htmlspecialchars ($ data)));'. Что-то вроде этого? –

+0

'htmlspecialchar' преобразует специальные символы, которые будут создавать элементы для своих объектов, чтобы они не отображались.Вы хотите, чтобы некоторые элементы отображались, так что вам понадобится другой подход. – chris85

ответ

1

htmlspecialchars кодирует все символы, которые имеют (или могут) особое значение в XML, в частности, <, >, &, " и ' (если ENT_QUOTES установлен).

Таким образом, с помощью этой настройки браузер не сможет отобразить любые попытки вредоносного кода.

Например

<script>alert('bam');</script> 

будет

&lt;script&gt;alert('bam');&lt;/script&gt; 
//or with quotes constant 
&lt;script&gt;alert(&#039;bam&#039;);&lt;/script&gt; 

, который не будет обрабатывать JS. Таким образом, это может быть аффективным средством остановки инъекций XSS. Однако вы хотите, чтобы пользователи отправляли HTML-код, поэтому вам нужно будет сделать белый список утвержденных элементов. Вы можете сделать это, заменив <> на пользовательский текст, который не будет появляться на входах ваших пользователей. В моем примере ниже я выбрал custom_random_hack. Затем запустите все через htmlspecialchars, который будет кодировать все специальные символы. Затем конвертируйте свои измененные элементы обратно в свои HTML-элементы.

$string = '<p> 
    <em> 
     <strong><span style="font-size:36pt;">test</span></strong> 
    </em> 
</p>'; 
$allowedtags = array('p', 'em', 'strong'); 
echo '~<(/?(?:' . implode('|', $allowedtags) . '))>~'; 
$string = preg_replace('~<(/?(?:' . implode('|', $allowedtags) . '))>~', '#custom_random_hack$1custom_random_hack#', $string); 
echo str_replace(array('#custom_random_hack', 'custom_random_hack#'), array('<', '>'), htmlspecialchars($string, ENT_QUOTES)); 

Демо: https://eval.in/582759

0

Если вы хотите сохранить отступы:

оберните выход в <pre> тега. Это теги сохранить пробельные Charaters

Если вы хотите, чтобы вход будет визуализируется как HTML:

не используют htmlspecialchars. И да, это снова открывает ваше приложение для XSS.

+0

Вопрос в том, как предотвратить инъекции XSS, хотя .. – chris85

+0

Если он хочет, чтобы HTML ** и ** были в безопасности от XSS, он должен был бы дезинфицировать входные данные и отображать дезинфицированный вход как HTML. Например, использование некоторого синтаксиса псевдокода в редакторе, например, программное обеспечение buelltinboard. – AUsr19532

1

Для предотвращения XSS инъекций и показать правильно, как только тот strip_tag()isn't fully safe, вы должны смотреть в HTML PURIFIER

Я надеюсь, что это помогает!