允许用户使用通配符的安全性


Security letting users use wildcards

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

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

我知道用户正则表达式会导致需要很长时间才能计算的常规压抑。我认为在这种情况下我不可能,但这样做还有其他安全问题吗?

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

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

如果您所做的只是像这样简单的替换

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

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

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

好:

  • *foo
  • bar*

不如:

  • *foo*
  • ba*r

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

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

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

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

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

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

有很多

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

你可以看看狮身人面像,Solr,Xapian甚至Lucene。都有很好的选择。

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

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

然后,您可能会对此问题感兴趣:选择独立的全文搜索服务器:狮身人面像还是SOLR?