我正在努力理解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 > 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中使用。