如何为SQLite FTS查询转义字符串
我正在尝试使用不可信的用户输入执行SQLite FTS查询。我不想让用户访问查询语法,也就是说,他们将无法执行像如何为SQLite FTS查询转义字符串,sqlite,full-text-search,fts4,Sqlite,Full Text Search,Fts4,我正在尝试使用不可信的用户输入执行SQLite FTS查询。我不想让用户访问查询语法,也就是说,他们将无法执行像foo或bar和cat这样的匹配查询。如果他们试图使用该字符串进行查询,我会将其解释为更像foo\或bar\和cats SQLite中似乎没有为此内置任何东西,因此我可能最终会构建自己的转义函数,但这似乎很危险,而且容易出错。有没有更好的方法可以做到这一点?好的,我已经做了进一步的研究,通过一些强大的魔法,您可以访问SQLite的FTS使用的实际标记器。“simple”标记器接受您的字
foo或bar和cat这样的匹配查询。如果他们试图使用该字符串进行查询,我会将其解释为更像foo\或bar\和cats
SQLite中似乎没有为此内置任何东西,因此我可能最终会构建自己的转义函数,但这似乎很危险,而且容易出错。有没有更好的方法可以做到这一点?好的,我已经做了进一步的研究,通过一些强大的魔法,您可以访问SQLite的FTS使用的实际标记器。“simple”标记器接受您的字符串,在[A-Za-z0-0]中未包含的任何字符上将其分隔,并将其余字符小写。如果您执行相同的操作,您将得到一个适合FTS的很好的“转义”字符串
您可以自己编写,但也可以访问SQLite的内部版本。有关这一点的详细信息,请参见此问题:FTS匹配语法是它自己的小语言。对于FTS5,逐字字符串文字为:
在FTS表达式中,可通过以下两种方式之一指定字符串:
- 通过将其括在双引号(“)中。在一个字符串中,任何嵌入的双引号字符都可以通过添加第二个双引号字符来转义SQL样式
- (特例编辑)
事实证明,为FTS查询正确转义字符串非常简单,可以完全可靠地实现:将“
替换为”
,并在两端将结果括在“
中
在我的例子中,当我把它放入一个准备好的语句中,比如SELECT stuf FROM fts\u table WHERE fts\u table MATCH?
,它就完美地工作了。然后我将.bind(fts\u escape(用户输入))
其中fts\u escape
是我上面描述的函数。从FTS4迁移到FTS5时,我注意到一件奇怪的事情,我不得不将形式的“连字符的工作*”
更改为连字符的工作*
。但是,做类似于匹配?| |“*”
的事情会更好吗?