我尝试使用不受信任的用户输入执行SQLite FTS查询。我不想让用户访问查询语法,也就是说他们无法执行匹配查询,如foo OR bar AND cats
。如果他们尝试使用该字符串进行查询,我希望将其解释为更像foo \OR bar \AND cats
。
对于SQLite来说似乎没有内置任何东西,所以我可能最终会构建自己的转义函数,但这似乎很危险且容易出错。有没有一种首选的方法呢?
答案 0 :(得分:0)
好的我已经进行了进一步的调查,并且通过一些重要的魔法,你可以访问SQLite的FTS使用的实际的标记器。 "简单" tokenizer接受你的字符串,将它分隔在[A-Za-z0-0]中没有的任何字符上,并将其余字符串小写。如果你执行相同的操作,你将得到一个很好的"逃脱"适合FTS的字符串。
您可以自己编写,但也可以访问SQLite的内部版本。有关详细信息,请参阅此问题:Automatic OR queries using SQLite FTS4
答案 1 :(得分:0)
FTS MATCH语法是它自己的小语言。对于FTS5,逐字字符串文字为well defined:
在FTS表达式中,可以用以下两种方式之一指定字符串:
用双引号(“)括起来。在一个字符串中,任何嵌入的双引号字符都可以通过添加第二个双引号字符来转义为SQL样式。
(编辑特例)
事实证明,正确转义FTS查询的字符串非常简单,可以完全可靠地实现:将"
替换为""
,并将结果括在"
的两端。
在我的情况下,当我把它放到SELECT stuff FROM fts_table WHERE fts_table MATCH ?
之类的准备好的语句中时它会完美地工作。然后我会.bind(fts_escape(user_input))
fts_escape
是我上面描述的函数。