检测并阻止XSS,但允许html格式


Detecting and preventing XSS, but allowing the html formatting

我正在努力理解XSS攻击。我了解到,无论何时向浏览器输出来自用户输入的内容,我都应该使用htmlspecialchar()。下面的代码运行良好。

我不明白的是,是否需要在这里使用htmlspecialchar()来响应$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在阻止XSS的同时保留HTML格式吗?

更新

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

成功了!

任何时候在HTML上下文中使用任意数据时,都应该使用htmlspecialchars()。这样做的原因是,它可以防止您的文本内容被视为HTML,如果来自外部用户,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中使用。