【问题标题】:How to display htmlspecialchars on the html?如何在 html 上显示 htmlspecialchars?
【发布时间】:2016-06-03 13:36:40
【问题描述】:

我在这里读过:
https://stackoverflow.com/a/8932454/4301970
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 注入?

【问题讨论】:

  • 你可以在你的元素之后使用 \n 来换行,而 \t 来换行。
  • nl2br(str_replace(" ", "$nbsp;" htmlspecialchars($data)));。像这样?
  • htmlspecialchar 将创建元素的特殊字符转换为其实体,因此它们不会被渲染。您希望渲染一些元素,因此您需要一种不同的方法。
  • 将您想要允许的元素转换为不同的符号,然后运行 ​​htmlspecial 字符,然后取消转换您允许的元素。
  • 这是一个起点,eval.in/582759

标签: php xss code-injection htmlspecialchars


【解决方案1】:

htmlspecialchars 编码所有在 XML 中具有(或可能)特殊含义的字符,特别是 &lt;&gt;&amp;"'(如果设置了 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,因此您需要制作一种已批准元素的白名单。您可以通过将&lt;&gt; 替换为不会出现在用户输入中的自定义文本来做到这一点。在下面的示例中,我选择了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_hack$1custom_random_hack#', $string);
echo str_replace(array('#custom_random_hack', 'custom_random_hack#'), array('<', '>'), htmlspecialchars($string, ENT_QUOTES));

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

【讨论】:

    【解决方案2】:

    为了防止xss注入并正确显示,一旦strip_tag()isn't fully safe,你应该看看HTML PURIFIER

    我希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      如果要保留缩进:

      将您的输出包装在 &lt;pre&gt; 标记中。此标签保留空白字符

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

      不要使用htmlspecialchars。是的,这会再次将您的应用打开到 XSS。

      【讨论】:

      • 如果他想要渲染 HTML 并且免受 XSS 攻击,他必须对输入进行清理并将清理后的输入呈现为 HTML。例如在 buelltinboard 软件等编辑器中使用一些伪代码语法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多