当查询具有 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。
对不起,标题不好,但我在网上搜索了几个小时,但找不到任何东西。
想一想使用文本“这很好”执行的用户搜索。我想按空格拆分文本并根据字数使用多个“或...类似”进行 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。