如何在 html 上显示 htmlspecialchars?

How to display htmlspecialchars on the html?

我读过这里:

htmlspecialchars() 非常有效地防止 xss 攻击。

我从所见即所得的编辑器接收格式化文本,例如:

<p>
    <em>
        <strong><span style="font-size:36pt;">test</span></strong>
    </em>
</p>

在我的 html 上对此进行编码:

<!DOCTYPE html>
<html lang=en>
<head>
    <title></title>
</head>
<body>
<?php echo htmlspecialchars('<p><em><strong><span style="font-size:36pt;">test</span></strong></em></p>', ENT_QUOTES); ?>
</body>
</html>

将在浏览器上输出:

<p><em><strong><span style="font-size:36pt;">test</span></strong></em></p>

如何正确显示格式化文本,同时防止 XSS 注入?

如果要保留缩进:

将输出包装在 <pre> 标记中。此标签保留空白字符

如果您希望输入呈现为 HTML:

不要使用 htmlspecialchars。是的,这会再次向 XSS 打开您的应用程序。

为防止xss注入并正确显示,一旦strip_tag()isn't fully safe, you should take a look in HTML PURIFIER

希望对您有所帮助!

htmlspecialchars 编码在 XML 中具有(或可能)特殊含义的所有字符,特别是 <>&",和 '(如果设置了 ENT_QUOTES)。

因此,使用此设置,浏览器将不会呈现任何恶意代码尝试。

例如

<script>alert('bam');</script>

会是

&lt;script&gt;alert('bam');&lt;/script&gt;
//or with quotes constant
&lt;script&gt;alert(&#039;bam&#039;);&lt;/script&gt;

哪个JS不会处理。因此,这可能是阻止 XSS 注入的有效方法。但是,您希望用户提交一些 HTML,因此您需要制作一种已批准元素的白名单。您可以通过将 <> 替换为用户输入中不会出现的自定义文本来实现。在下面的示例中,我选择了 custom_random_hack。然后 运行 通过 htmlspecialchars 的所有内容都将对所有特殊字符进行编码。然后将交换的元素转换回它们的 HTML 元素。

$string = '<p>
    <em>
        <strong><span style="font-size:36pt;">test</span></strong>
    </em>
</p>';
$allowedtags = array('p', 'em', 'strong');
echo '~<(/?(?:' . implode('|', $allowedtags) . '))>~';
$string = preg_replace('~<(/?(?:' . implode('|', $allowedtags) . '))>~', '#custom_random_hackcustom_random_hack#', $string);
echo str_replace(array('#custom_random_hack', 'custom_random_hack#'), array('<', '>'), htmlspecialchars($string, ENT_QUOTES));

演示:https://eval.in/582759