【问题标题】:Users entering ampersand & character messing up my sites w3c validation用户输入 & 和字符弄乱了我的网站 w3c 验证
【发布时间】:2009-10-24 10:48:21
【问题描述】:

我的社交网站是 w3c xhtml 有效的,但是用户可以发布博客报告和内容,有时会输入与号字符,这反过来又会扰乱我的验证。我该如何解决这个问题,是否有任何其他我需要注意的单个字符可能会扰乱我的验证?

【问题讨论】:

    标签: php xhtml w3c-validation html-encode


    【解决方案1】:

    当显示用户制作的内容时,通过htmlspecialchars() 函数运行它。

    【讨论】:

    • 更具体地说,清理和验证任何外部输入,无论是来自用户还是外部系统。 EG:你可能相信谷歌会用 OpenID 做正确的事,但你相信所有的 OpenID 提供商吗?知道什么对任何给定的输入有效,删除/失败除此之外的任何内容。知道什么对任何显示有效,删除/失败除此之外的任何内容。这也适用于将 JavaScript 插入表单的人。
    • 问题是我允许用户输入特定的标签,比如粗体标签和引号标签
    • 如果你允许 HTML,你会从用户那里得到格式错误的标记,这是事实;和号只是冰山一角。您可以通过 HTML Tidy 运行输入标记来修复它,但是如果您允许发布 HTML,您也会遇到一个很大的安全问题,因为任何用户都可以将脚本内容注入您的站点,从而攻击任何其他用户。如果您必须允许发布标记,请查看 HTML Purifier,但正如 hobbs 所说,如果您想要的只是简单的东西,如粗体和斜体,那么您会好多更好(为了您的用户的安全性和可用性) 使用简单的标记语言。
    • 但是:如果您的用户提交的字符不在当前字符集中,它将被 html 编码([0-9]+;),转义这个 & 会弄乱这些 pre -编码的实体。
    【解决方案2】:

    作为一般原则,将用户提交的(或实际上任何外部的)内容直接包含到您的页面中而不进行验证或过滤是错误的。除了导致验证错误之外,它还可能导致“页面损坏”和大型安全漏洞(跨站点脚本攻击)。

    每当您从任何地方获得并非 100% 可信的数据时,您都需要以某种方式确保其安全。您可以通过执行以下部分或全部操作来做到这一点:

    1. 转义文本数据,以便将特殊字符替换为代表它们的 HTML 实体。
    2. 剥离过滤不安全的 HTML 标签。
    3. 验证 HTML 不包含任何不安全或非法的结构。

    如果您的用户输入要被解释为文本,那么您主要关注的是选项 1;如果您让用户使用 HTML,那么您正在查看选项 2 和 3。第四个选项是让用户使用一些更具限制性的非 HTML 标记,例如 Markdown 或 bbCode,在该标记和 HTML 之间使用(希望)不允许注入安全漏洞、分页结构或其他可怕事物的库。

    【讨论】:

      【解决方案3】:

      允许用户输入 HTML 标记是个坏主意。

      这会导致各种令人讨厌的事情,最明显的是跨站点脚本 (XSS) 漏洞利用和隐藏垃圾邮件注入(对您隐藏,而不是搜索引擎机器人)。

      你应该:

      • 使用 htmlspecialchars() 删除所有 HTML 标记,仅使用 nl2br() 保留换行符。您可以通过实现自己的安全标记来允许某些格式,该标记只允许非常特定的标记(例如 phpBB 或类似 Wiki 的标记)。

      • 使用HTML Purifier 可靠地消除所有潜在危险的标记。 PHP 的 strip_tags() 函数从根本上被破坏,如果您使用白名单参数,则允许在属性中使用危险代码。

      【讨论】:

        猜你喜欢
        • 2014-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-14
        • 1970-01-01
        • 2011-03-17
        相关资源
        最近更新 更多