wxs*_*wxs 6 sqlite full-text-search fts4
我正在尝试使用不受信任的用户输入执行 SQLite FTS 查询。我不想让用户访问查询语法,也就是说他们将无法执行像foo OR bar AND cats. 如果他们尝试使用该字符串进行查询,我想将其解释为更像foo \OR bar \AND cats.
SQLite 似乎没有为此内置任何内容,因此我可能最终会构建自己的转义函数,但这似乎很危险且容易出错。有没有首选的方法来做到这一点?
FTS MATCH 语法是它自己的小语言。对于 FTS5,逐字字符串文字定义明确:
在 FTS 表达式中,可以通过以下两种方式之一指定字符串:
通过将其括在双引号 (") 中。在字符串中,任何嵌入的双引号字符都可以转义 SQL 样式 - 通过添加第二个双引号字符。
(编辑特殊情况)
事实证明,正确转义的FTS查询字符串是很简单的,完全和可靠地执行:更换"与""和封闭结果"两端。
在我的情况下,当我将它放入准备好的语句中时,它可以完美地工作,例如SELECT stuff FROM fts_table WHERE fts_table MATCH ?. 那么我会.bind(fts_escape(user_input))在哪里fts_escape我上面描述的功能。
好的,我已经进一步研究了,通过一些强大的魔法,您可以访问 SQLite 的 FTS 使用的实际标记器。“简单”标记生成器获取您的字符串,将其分隔为不在 [A-Za-z0-0] 中的任何字符,并将其余字符小写。如果执行相同的操作,您将获得一个适合 FTS 的完美“转义”字符串。
您可以编写自己的数据库,但也可以访问 SQLite 的内部数据库。有关详细信息,请参阅此问题:使用 SQLite FTS4 自动 OR 查询
| 归档时间: |
|
| 查看次数: |
1754 次 |
| 最近记录: |