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

时间:2013-12-12 21:11:00

标签: php xss htmlspecialchars htmlpurifier

我正在尝试了解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是否会在阻止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>";

诀窍!

1 个答案:

答案 0 :(得分:2)

每当您在HTML上下文中使用任意数据时,您应该使用htmlspecialchars()。这样做的原因是它可以防止您的文本内容被视为HTML,如果来自外部用户,则可能是恶意的。它还可以确保您生成浏览器可以一致处理的有效HTML。

假设我想在HTML中显示文本“8&gt; 3”。为此,我的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中使用。