【问题标题】:Protection against XSS exploits?防止 XSS 攻击?
【发布时间】:2011-03-24 04:58:07
【问题描述】:

我对 PHP 很陌生,但我听说 XSS 漏洞利用很糟糕。我知道它们是什么,但如何保护我的网站?

【问题讨论】:

    标签: php xss


    【解决方案1】:

    为了防止 XSS 攻击,您只需正确检查并验证您计划使用的所有用户输入数据,并且不允许从该表单插入 html 或 javascript 代码。 或者您可以使用 htmlspecialchars() 将 HTML 字符转换为 HTML 实体。因此,像 这样标记标签开始/结束的字符将转换为 html 实体,您可以使用 strip_tags() 仅允许某些标签,因为该函数不会去除有害属性,如 onclick 或 onload。

    【讨论】:

      【解决方案2】:

      使用htmlentities() 函数转义所有用户数据(数据库中的用户数据)。

      对于 HTML 数据(例如来自 WYSIWYG 编辑器),在将数据保存到数据库之前,请使用 HTML Purifier 清理数据。

      【讨论】:

      • 我是否需要使用mysqli_preg_replace(),即使在使用HTML Purifier 之后?htmlentities() 是否为表单中的text field 提供足够的安全性来清理数据?你可以建议我一些linksvideos 以开始使用HTML Purifier
      【解决方案3】:

      strip_tags() 如果你不想有任何标签。这意味着像<somthinghere>
      htmlspecialchars() 这样的东西会将它们转换为 html,因此浏览器只会显示而不尝试运行。
      如果你想允许好的 html,我会使用 htmLawedhtmlpurifier

      【讨论】:

        【解决方案4】:

        坏消息

        很遗憾,preventing XSS in PHP 是一项不平凡的工作。

        SQL injection 不同,您可以通过准备好的声明和精心挑选的白名单来缓解这种情况,没有可证明的安全方法将您尝试传递给 HTML 文档的信息与文档结构的其余部分分开。

        好消息

        但是,您可以通过在转义时特别小心 (and keeping your software up-to-date) 来缓解已知的攻击媒介。

        要牢记的最重要的规则:始终在输出时转义,从不在输入时。如果您担心性能,可以安全地缓存转义的输出,但始终在未转义的数据。

        XSS 缓解策略

        按优先顺序:

        1. 如果您使用的是模板引擎(例如 Twig、Smarty、Blade),请检查它是否提供上下文相关转义。我从经验中知道 Twig 是这样的。 {{ var|e('html_attr') }}
        2. 如果要允许 HTML,请使用 HTML Purifier。即使您认为您只接受 Markdown 或 ReStructuredText,您仍然希望净化这些标记语言输出的 HTML。
        3. 否则,请使用htmlentities($var, ENT_QUOTES | ENT_HTML5, $charset) 并确保文档的其余部分使用与$charset 相同的字符集。在大多数情况下,'UTF-8' 是所需的字符集。

        为什么我不应该过滤输入?

        尝试在输入上过滤 XSS 是 premature optimization,这可能会导致其他地方出现意外漏洞。

        例如,最近的WordPress XSS vulnerability 使用 MySQL 列截断来破坏其转义策略并允许过早转义的有效负载不安全地存储。不要重复他们的错误。

        【讨论】:

          猜你喜欢
          • 2022-01-08
          • 1970-01-01
          • 1970-01-01
          • 2023-03-04
          • 1970-01-01
          • 1970-01-01
          • 2018-07-16
          相关资源
          最近更新 更多