Sphinx - 如何转义 SphinxQL 的用户输入?
Sphinx - How to escape user input for SphinxQL?
我有一个网站,用户可以通过输入关键字搜索帖子,
我正在使用 Sphinx 搜索进行全文搜索,一切正常。
但是当我 enter/input 搜索查询中的一些特殊字符时,搜索没有完成并抛出错误。
例如
我搜索的关键字:
hello)
我对 sphinxql 的查询:
SELECT id FROM index1 WHERE MATCH('hello)')
我得到的错误:
index index1: syntax error, unexpected ')' near ')'
我的 php 代码如下所示
<?php
$sphinxql = mysqli_connect($sphinxql_host.':'.$sphinxql_port,'','') or die('ERROR');
$q = urldecode($_GET['q']);
$sphinxql_query = "SELECT id FROM $sphinx_index WHERE MATCH('".$q."') ";
?>
我如何转义用户输入并确保查询不会中断并且 return 结果集?
你应该使用SQL转义,以避免SQL注入。
http://php.net/manual/en/mysqli.real-escape-string.php
$sphinxql_query = ".... MATCH('".mysqli_real_escape_string($sphinxql,$q)."') ";
...但是您可能 还想转义扩展语法。
在 sphinx 论坛的这个帖子中查看前三个帖子(之后深入了解误解)
http://sphinxsearch.com/forum/view.html?id=13619
对于一个简单的解决方案。
该线程中的函数可用于使您的查询工作。它将转义 ) 并停止将其视为操作员。
但是,这也意味着您不能使用 any 搜索运算符 - 因为它会盲目地将它们全部转义。 (这是线程后面的混乱)
如果你想能够使用部分或全部运算符,需要使用更高级的转义。 (我没有好的解决方案)
编辑:实际上放手了……
<?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。这意味着没有运算符会起作用,因为它们将被完全转义。
EscapeString 函数也需要对 < 字符进行转义。另请参阅 PECL shpinx 中的 escapeString 函数以供参考。
我有一个网站,用户可以通过输入关键字搜索帖子, 我正在使用 Sphinx 搜索进行全文搜索,一切正常。
但是当我 enter/input 搜索查询中的一些特殊字符时,搜索没有完成并抛出错误。
例如 我搜索的关键字:
hello)
我对 sphinxql 的查询:
SELECT id FROM index1 WHERE MATCH('hello)')
我得到的错误:
index index1: syntax error, unexpected ')' near ')'
我的 php 代码如下所示
<?php
$sphinxql = mysqli_connect($sphinxql_host.':'.$sphinxql_port,'','') or die('ERROR');
$q = urldecode($_GET['q']);
$sphinxql_query = "SELECT id FROM $sphinx_index WHERE MATCH('".$q."') ";
?>
我如何转义用户输入并确保查询不会中断并且 return 结果集?
你应该使用SQL转义,以避免SQL注入。
http://php.net/manual/en/mysqli.real-escape-string.php
$sphinxql_query = ".... MATCH('".mysqli_real_escape_string($sphinxql,$q)."') ";
...但是您可能 还想转义扩展语法。
在 sphinx 论坛的这个帖子中查看前三个帖子(之后深入了解误解) http://sphinxsearch.com/forum/view.html?id=13619
对于一个简单的解决方案。
该线程中的函数可用于使您的查询工作。它将转义 ) 并停止将其视为操作员。
但是,这也意味着您不能使用 any 搜索运算符 - 因为它会盲目地将它们全部转义。 (这是线程后面的混乱)
如果你想能够使用部分或全部运算符,需要使用更高级的转义。 (我没有好的解决方案)
编辑:实际上放手了……
<?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。这意味着没有运算符会起作用,因为它们将被完全转义。
EscapeString 函数也需要对 < 字符进行转义。另请参阅 PECL shpinx 中的 escapeString 函数以供参考。