我正在尝试了解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>";
诀窍!
答案 0 :(得分:2)
每当您在HTML上下文中使用任意数据时,您应该使用htmlspecialchars()
。这样做的原因是它可以防止您的文本内容被视为HTML,如果来自外部用户,则可能是恶意的。它还可以确保您生成浏览器可以一致处理的有效HTML。
假设我想在HTML中显示文本“8&gt; 3”。为此,我的HTML代码为8 > 3
。 >
编码为>
,因此不会将其误解为标记的一部分。
现在,假设我正在制作一个关于如何编写HTML的网页。我希望用户看到以下内容:
<p>This is how to make a paragraph</p>
如果我不希望将<p>
和</p>
解释为实际段落,而是将其解释为文本,则需要进行编码:
<p>This is how to make a paragraph</p>
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中使用。