【问题标题】:User Input filtering in PHPPHP中的用户输入过滤
【发布时间】:2010-11-05 03:02:09
【问题描述】:

我目前正在开发一个应用程序,该应用程序要求用户提交显示在网站上的帖子和 cmets。众所周知,用户输入不可信,所以我使用 htmlspecialchars($string,ENT_QUOTES) 来处理用户的帖子和 cmets。

现在,我希望忽略某些 html 标签。例如<b><br /> 和更多标签。我该怎么做才能让 htmlspecialchars 在过滤其他标签时忽略一些标签。

【问题讨论】:

  • 比如……?似乎SO不想显示那些标签,)

标签: php blogs user-input textinput htmlspecialchars


【解决方案1】:

解决方案 a)
使用 htmlspecialchars 中的 strip_tags,并将所需的标签列入白名单。
更好的解决方案 b)
使用 bbcodes,并给想要的标签起别名,例如:[b]bold[/b]

【讨论】:

    【解决方案2】:

    非常非常困难只允许一些 HTML 标签而不允许任何脚本注入或类似的可能性。

    我实际上建议避免这种情况并使用生成 HTML 的东西,例如 this UBB code parser(或类似的)。甚至Markdown(关闭 HTML 选项)。

    这使攻击者无法攻击您的网站,如果它是面向公众的,这一点非常重要。

    如果您甚至允许某些 HTML 通过,那么坚定的攻击者很可能会找到绕过它的方法。

    【讨论】:

      【解决方案3】:

      由于当前的 HTML 过滤器不足或不安全而厌倦了使用 BBCode?​​1234565>--> HTML Purifier
      HTML Purifier 是一个用 PHP 编写的符合标准的 HTML 过滤器库。 HTML Purifier 不仅会使用经过全面审核、安全且允许的白名单删除所有恶意代码(更广为人知的 XSS),...

      【讨论】:

      • 昨天了解到这一点,整个噩梦般的安全领域都解决了。
      【解决方案4】:

      您可以替换带引号的字符串以重新插入允许的标签。以<b> 标签为例:

      $string = str_replace(array('&lt;b&gt;', &lt;/&gt;), array('<b>', '</b>'), $string);
      

      我只允许非常独特、完整的标签尽可能安全。 IE。非必要时不要使用正则表达式,这会导致非常严重的错误。

      【讨论】:

        【解决方案5】:

        我强烈建议您使用 Zend_Filter 过滤用户输入。具体见: http://framework.zend.com/manual/en/zend.filter.html#zend.filter.introduction.using

        【讨论】:

        【解决方案6】:

        这并不像你想象的那么简单,因为htmlspecialchars()htmlentities() 都没有提供任何选项来忽略某些标签(这两个函数甚至都不知道 标签概念的含义)。

        您可以使用其他方式来允许用户格式化他们的帖子,例如BBCodeTextileMarkdown。所有这些都有可用的 PHP 解析器。

        如果您必须坚持使用 html-tags,您可以采取一些预处理来重新格式化允许的标签,以便它们不会受到htmlspecialchars() 的影响。然后,您可以对结果进行后处理以将格式改回普通的 HTML 标记。以下示例通过简单的&lt;a&gt;-tag 可视化了此过程。请注意,使用正则表达式处理 HTML 很容易出错,而且并不总是可行的方法——我将在本例中使用它只是为了简单起见。

        $input = preg_replace('~<(/?\w+([^>]*?))>~', '|#$1#|', $input);
        $input = htmlspecialchars($input);
        $inoput = preg_replace('~|#(/?\w+(.*?))#|~', '<$1>', $input);
        

        这是未经测试的,肯定需要更多的工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-01-14
          • 2011-01-21
          • 2011-08-30
          • 2011-08-23
          • 1970-01-01
          • 2013-04-16
          • 2011-05-18
          相关资源
          最近更新 更多