【问题标题】:Security letting users use wildcards允许用户使用通配符的安全性
【发布时间】:2012-06-13 09:34:27
【问题描述】:

我需要让我的用户在搜索中使用星号 (*) 作为通配符。

将星号转换为 % 并在 sql 查询中使用 LIKE 是否安全。

我知道用户正则表达式可能会导致需要永远计算的常规 epressions。 我认为在这种情况下我不可能,但这样做是否还有其他安全问题?

【问题讨论】:

  • 您能否向我们展示您提出的示例查询?我会为用户搜索设置一个时间限制,以防止他们过于用力地冲击您的服务器。
  • 也许通过集成 Lucene 等搜索引擎可以更好地为您的应用程序提供服务。

标签: php mysql


【解决方案1】:

like 表达式中的通配符会导致查询执行发生变化,从而使 RDBMS 使用全表扫描而不是使用索引。当有大量数据时,这可能会减慢查询速度。我建议检查用户输入的第一个星号前是否存在至少几个非通配符。

另外请注意,如果您将* 转换为%,并使用LIKE,您还需要注意_,否则它将匹配任何单个字符,而不仅仅是下划线。

【讨论】:

    【解决方案2】:

    如果你所做的只是一个简单的替换

    str_replace('*','%',$query)
    

    那么我没有预见到任何安全问题,我相信这是您所关心的。您不会打开任何 SQL 注入的可能性或任何东西(至少不会通过进行此替换,如果您不转义输入,您可能仍然存在安全问题)。

    但是,正如其他一些用户指出的那样,您会发现一些性能问题。如果我只搜索* 会发生什么,我会拿回你的整个桌子吗?最好的方法(如果你不想使用database search engine)是做一些用户验证。如果您想防止对查询进行全表扫描,很可能您会希望限制用户只使用前导通配符或尾随通配符。

    好:

    • *foo
    • bar*

    不太好:

    • *foo*
    • ba*r

    这实际上取决于您拥有多少行以及您对用户提供实际输入的信任程度。

    【讨论】:

      【解决方案3】:

      真正的问题是,让用户决定部分查询是否安全。

      即使在简单的情况下,向数据库提供用户数据也是不安全

      允许用户输入直接提供给数据库可能是危险的,但就您的过滤器和使用您的数据库转义策略而言(即:mysql_real_escape_string()(精心准备的语句或任何 ORM 将为你做)应该足够安全。

      但是,它可能会导致性能问题,查询中的简单EXPLAIN 应该会警告您 RDBMS 引擎扫描了多少行。

      实现此类功能的最佳方式是使用搜索引擎。 (这不是你想要做的吗?)

      有很多选择可以帮助您实现这一点。

      你可以看看 Sphinx、Solr、Xapian 甚至 Lucene。都有很好的选择。

      它们基本上允许您“索引”您的内容以进行全文搜索,同时提高性能。

      它们还可以提供一些令人难以置信的功能,例如ORANDLIKEMINUS 等比较器/运算符。

      你可能会对这个问题感兴趣:Choosing a stand-alone full-text search server: Sphinx or SOLR?

      【讨论】:

        猜你喜欢
        • 2015-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-17
        • 2021-08-27
        • 2013-12-15
        • 2016-02-09
        • 1970-01-01
        相关资源
        最近更新 更多