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

时间:2012-06-12 22:26:09

标签: php mysql

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

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

我知道user-regexp可能会导致定期出现,需要永久计算。 我认为在这种情况下我不可能,但这样做是否还有其他任何安全问题?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

然后我没有预见到任何安全性问题,我相信这是你所关心的。你不会打开任何SQL注入的可能性或任何东西(至少不通过这种替换,你可能仍然有安全问题,如果你没有逃避输入)。

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

好:

  • *foo
  • bar*

不太好:

  • *foo*
  • ba*r

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

答案 2 :(得分:0)

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

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

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

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

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

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

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

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

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

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