当查询具有 dynamically-generated/variable-length 个参数列表时防止 SQL 注入

Prevent SQL injection when queries have dynamically-generated/variable-length parameter lists

对不起,标题不好,但我在网上搜索了几个小时,但找不到任何东西。

想一想使用文本“这很好”执行的用户搜索。我想按空格拆分文本并根据字数使用多个“或...类似”进行 SQL 查询。它可能是多个。我试过了;

sub_query ""
search = "this is good"
split_by_space = search.split(" ")
for word in split_by_space:
    sub_query = sub_query + "content like '%{}%' or".format(word) #---> THIS IS NOT ESCAPED
sub_query = sub_query[0:-3] #---> to remove last ' or'
cursor.execute("select content from posts where %s",(sub_query))

这不是防止 SQL 注入或准备语句的正确方法。

那么,如果我想按空格分割单词并搜索每个单词,如何在Python/pymysql中制作准备语句?

这是一种安全的方法:

search = "this is good"
split_by_space = search.split(" ")
terms = []
params = []
for word in split_by_space:
    terms.append("content like %s")
    params.append("%%{}%%".format(word)) 
query = "select content from posts where %s".format(" OR ".join(terms))
cursor.execute(query, params)

但是你会发现使用 LIKE 和通配符的效果并不好。使用 LIKE 可以使查询比使用全文索引长 倍(取决于 table 有多少行)。请参阅我的演示文稿 Full Text Search Throwdown