Sphinx - 如何逃避SphinxQL的用户输入?

时间:2015-08-14 14:41:05

标签: php sphinx sphinxql

我有一个网站,用户可以通过输入关键字搜索帖子, 我正在使用Sphinx搜索全文搜索,每个人都按预期工作。

但是当我在搜索查询中输入/输入一些特殊的字符时,搜索dosnt就完成并抛出错误。

e.g。 关键字i搜索:

users.php

我对sphinxql的查询:

hello)

我得到的错误:

SELECT id FROM index1 WHERE MATCH('hello)') 

我的php代码看起来像这样

index index1: syntax error, unexpected ')' near ')'

如何逃避用户输入并确保查询不会制动并返回结果集?

2 个答案:

答案 0 :(得分:3)

应该使用SQL转义,以避免SQL注入。

http://php.net/manual/en/mysqli.real-escape-string.php

$sphinxql_query = ".... MATCH('".mysqli_real_escape_string($sphinxql,$q)."') ";

...但是你可能也想要逃避扩展语法。

在狮身人面像论坛的这个帖子中查看第一个三个帖子(之后它会深入研究误解) http://sphinxsearch.com/forum/view.html?id=13619

一个简单的解决方案。

该线程中的函数可用于使查询起作用。它会逃脱)并阻止它被视为一个操作员。

但是,这也意味着你可以使用任何搜索运算符 - 因为它会盲目地将它们全部转义。 (这是线程后期的混乱)

如果您希望能够使用部分或全部运算符,则需要使用更高级的转义。 (我没有很好的解决方案)

编辑:actully让我们全力以赴......

<?php

//Escapes all the Extended syntax, so can accept anything the user throws at us. 
function EscapeString ( $string ) {
   $from = array ( '\\', '(',')','|','-','!','@','~','"','&', '/', '^', '$', '=' );
   $to = array ( '\\\\', '\(','\)','\|','\-','\!','\@','\~','\"', '\&', '\/', '\^', '\$', '\=' );
   return str_replace ( $from, $to, $string );
}

if ($allow_full_extended_syntax) {
   $q = $_GET['q']; 
   // the user is responsible for providing valid query.
} elseif ($allow_partical_extended_syntax) {
   $q = InteligentEscape($_GET['q']); 
   //I don't have this function, it would need to be created. 
} else {
   $q = EscapeString($_GET['q']); 
   // escapes ALL extended syntax. NO operators allowed 
}

 $sphinxql_query = ".... MATCH('".mysqli_real_escape_string($sphinxql,$q)."') ";

然后听起来你想要$ allow_full_extended_syntax和$ allow_partical_extended_syntax都设置为false。这意味着没有运营商会工作,因为他们将完全逃脱。

答案 1 :(得分:0)

EscapeString函数也需要转义<字符。另请参见PECL shpinx中的escapeString函数以供参考。