如何为SQLite FTS查询转义字符串

时间:2015-03-10 18:41:51

标签: sqlite full-text-search fts4

我尝试使用不受信任的用户输入执行SQLite FTS查询。我不想让用户访问查询语法,也就是说他们无法执行匹配查询,如foo OR bar AND cats。如果他们尝试使用该字符串进行查询,我希望将其解释为更像foo \OR bar \AND cats

对于SQLite来说似乎没有内置任何东西,所以我可能最终会构建自己的转义函数,但这似乎很危险且容易出错。有没有一种首选的方法呢?

2 个答案:

答案 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是我上面描述的函数。