【问题标题】:What to do with ASCII escape characters in user-generated markup?如何处理用户生成的标记中的 ASCII 转义字符?
【发布时间】:2010-09-05 08:31:24
【问题描述】:

我正在使用HTML Purifier,这是一个 PHP“过滤器,可防止 XSS 并确保符合标准的输出”来清理/标准化用户输入的标记。

这是用户输入标记的示例:

<font face="'Times New Roman', Times">TEST</font>

生成:

<span style="font-family:&quot;Times New Roman&quot;, Times;">TEST</span>

我有点困惑,因为&amp;quot 甚至不是单引号的转义字符。由于我稍后将使用此用户生成的内容,因此这里的最佳做法是什么?

  • 保持原样
  • 在净化器执行后将所有&amp;quot 替换为\'
  • Configure HTML Purifier 不同
  • 还有别的吗?

【问题讨论】:

    标签: php xhtml ascii web-standards user-generated-content


    【解决方案1】:

    我觉得不错。

    我认为从单引号到双引号的转换来自于这样一个事实,即 HTML 净化器将整个标记拆开,并根据自己的规则将其重新组合在一起,当引用 @ 内的内容时恰好使用双引号987654321@ 属性。

    这对我来说也很好。您验证的文档类型是什么?

    如果我没有忽略某些东西,我会说可以按原样使用。

    【讨论】:

    • 太棒了——如果你觉得它不错,那我就用它!谢谢!另外,我从我的帖子中取出了验证评论......它在 XHTML 1.0 Strict 中验证良好,这是我需要的。
    【解决方案2】:

    输出是 XHTML 有效的,但实体转换是错误的。 &lt;img src="/test" alt="I'm ok"/&gt; 将转换为 &lt;img src="/test" alt="I&amp;quot;m ok"&gt;

    一个简单的就足够了:

    $allowed_tags='<font>';
    echo htmlspecialchars(strip_tags(rawurldecode($input),$allowed_tags),ENT_COMPAT,'UTF-8');
    

    但它不会将 标签转换为

    【讨论】:

    • 实体转换并没有错误这样:HTML Purifier 解构了整个事物并用新的语法将其粘合在一起。该语法恰好使用&amp;quot; 而不是单引号。我真的看不出有什么问题。
    • 你说的完全有道理。但我刚试了一下,我得到了&lt;img src="hello.img" alt="I'm here" /&gt;,这意味着 HTML Purifier 必须对属性敏感。但是用例+1...我没有想到这一点,这绝对值得测试。该解决方案对于获得alt="I&amp;quot; ok" 的人来说应该是好的
    • @Pekka 我认为 Stillstanding 是在说 &amp;quot; 在他的示例中是不合适的,因为在 alt 标签中需要单引号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多