Обнаружение и предотвращение XSS, но разрешение форматирования html

Я пытаюсь понять XSS-атаки. Я узнал, что должен использовать htmlspecialchars() всякий раз, когда вывожу в браузер что-то, полученное от пользовательского ввода. Код ниже работает нормально.

Чего я не понимаю, так это того, нужно ли здесь использовать htmlspecialchars() для повторения $enrollmentno или нет?

 <?php 


$enrollmentno = (int)$_POST['enrollmentno'];





echo "<div style='border-radius:45px; border-width: 2px; border-style: dashed; border-color: black;'><center><h4><b>$enrollmentno</b></h4></center></div>";


$clink = "http://xyz/$enrollmentno/2013";

echo"<iframe src='$clink' width='1500' height='900' frameBorder='0'></iframe>";
?>

Если я сделаю что-то вроде

$safe = "<div style='border-radius:45px; border-width: 2px; border-style: dashed; border-color: black;'><center><h4><b>$enrollmentno</b></h4></center></div>";

echo htmlspecialchars($safe, ENT_QUOTES);

Он не показывает правильный формат HTML.

Я не уверен, что здесь нужно использовать HTMLPurifer. Сохраняет ли HTMLPurifer форматирование HTML, предотвращая XSS?

Обновить

echo "<div style='border-radius:45px; border-width: 2px; border-style: dashed; border-color: black;'><center><h4><b>".htmlspecialchars ($enrollmentno)."</b></h4></center></div>";

Делает трюк!


person Nick_inaw    schedule 12.12.2013    source источник
comment
Почему бы вам просто не очистить переменную, содержащую значение в $enrollmentno?   -  person Rahil Wazir    schedule 13.12.2013
comment
Спасибо. Будет ли это делать? echo "<div style='border-radius:45px; border-width: 2px; border-style: dashed; border-color: black;'><center><h4><b>".htmlspecialchars ($enrollmentno)."</b></h4></center></div>";   -  person Nick_inaw    schedule 13.12.2013
comment
Конечно! это сделает работу   -  person Rahil Wazir    schedule 13.12.2013
comment
Я нашел эту ссылку, где рекомендуется HTMLPurifier. Почему это так? Я в замешательстве, так как мой вопрос очень похож.   -  person Nick_inaw    schedule 13.12.2013
comment
Он специально написан для html/xss filteration и да, он мощнее, чем обычная функция PHP. Но PHP также предоставляет широкий спектр фильтров functions, constants, вы также можете использовать их без использования какого-либо стороннего скрипта.   -  person Rahil Wazir    schedule 13.12.2013
comment
Спасибо. Я не думаю, что в моем случае нужно использовать Htmlpurifier, верно?   -  person Nick_inaw    schedule 13.12.2013
comment
Это действительно зависит от вашего приложения. В моем случае используйте его, если вы сталкиваетесь с трудностями при фильтрации большого количества данных или любых данных.   -  person Rahil Wazir    schedule 13.12.2013


Ответы (1)


Каждый раз, когда вы используете произвольные данные в контексте HTML, вы должны использовать htmlspecialchars(). Причина этого в том, что он предотвращает обработку вашего текстового контента как HTML, который потенциально может быть вредоносным, если исходит от внешних пользователей. Это также гарантирует, что вы генерируете действительный HTML-код, который браузеры могут последовательно обрабатывать.

Предположим, я хочу, чтобы текст «8 > 3» отображался в HTML. Для этого мой HTML-код будет 8 &gt; 3. > кодируется как &gt;, чтобы его нельзя было неправильно интерпретировать как часть тега.

Теперь предположим, что я делаю веб-страницу о том, как писать HTML. Я хочу, чтобы пользователь увидел следующее:

<p>This is how to make a paragraph</p>

Если я не хочу, чтобы <p> и </p> интерпретировались как фактический абзац, а как текст, вам нужно закодировать:

&lt;p&gt;This is how to make a paragraph&lt;/p&gt;

htmlspecialchars() делает это. Он позволяет безопасно вставлять произвольный текст в HTML-контекст.

Теперь во втором примере:

$safe = "<div style='border-radius:45px; border-width: 2px; border-style: dashed; border-color: black;'><center><h4><b>$enrollmentno</b></h4></center></div>";
echo htmlspecialchars($safe, ENT_QUOTES);

Это делает именно то, что вы просили. Вы дали ему какой-то текст, и он его закодировал. Если вы хотите, чтобы это было как HTML, вы должны были просто повторить его.

Теперь, если вам нужно отобразить HTML как HTML, и он поступает из ненадежного источника (то есть не от вас), вам понадобятся такие инструменты, как HTMLPurifier. Вам это не нужно, если вы доверяете источнику. Пропуск всего вашего вывода через htmlspecialchars() не делает вещи волшебным образом безопасными. Он нужен только при вставке произвольных текстовых данных. Вот хороший вариант использования:

echo '<h1>Product Review from ', htmlspecialchars($username), '</h1>';
echo htmlspecialchars($reviewText);

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

person Brad    schedule 12.12.2013
comment
Идеально! Я думаю, что решил свой собственный вопрос, но ваше объяснение сделало это действительно ясным. Я не могу представить сценарий, в котором пользователю нужно будет предоставить HTML, а затем кому-то нужно будет использовать HTMLPurifier. Не могли бы вы привести простой пример использования HTMLpurifier в этом приложении? - person Nick_inaw; 13.12.2013
comment
@Nick_inaw Предположим, вы приняли комментарии в формате HTML на доске объявлений. Я думаю, что это был бы самый распространенный вариант использования, но опять же не распространенный. HTMLPurifier, безусловно, чрезмерно используется людьми, которые думают, что обеспечивают безопасность, когда вместо этого они ломают свои приложения и становятся менее безопасными. Его следует использовать только тогда, когда вы действительно хотите фильтровать HTML. - person Brad; 13.12.2013
comment
Я полностью понимаю это сейчас. Спасибо. - person Nick_inaw; 13.12.2013