据我了解,SQL 注入(inject)通常是不好的。这很好,因为如 PEP 249 中所述,您可以使用占位符来防止大多数通用注入(inject)。但是,我没有看到任何内容说明如何进行涉及动态 LIKE 的查询。
我的具体情况是我有一个 ajax 调用,该调用在名称字段的输入更改时运行。结果是我的查询结果被过滤 WHERE table.name LIKE name_var
作为一个简单的表示。显然,直接将 name_var 代入查询是非常危险的,你们中的一些人甚至可能因为看到这一点而受到了轻微的打击。但是我如何使它安全和动态呢?我是否构建自己的解析器? MySQLdb 是否有一些内置功能也可以处理这个问题?我似乎找不到太多有用的信息,所以我很感激任何帮助。
最佳答案
是的,MySQLdb 可以做到这一点。
sql = """SELECT ... WHERE t.name LIKE %s"""
cur = cnx.cursor(prepared=True)
cur.execute(sql, (name_var,))
如果您需要通配符以便搜索子字符串,您可以在 SQL 表达式中执行此操作:
sql = """SELECT ... WHERE t.name LIKE CONCAT('%', %s, '%')"""
cur = cnx.cursor(prepared=True)
cur.execute(sql, (name_var,))
或者您可以在将其作为参数传递之前对 Python 变量执行此操作:
sql = """SELECT ... WHERE t.name LIKE %s"""
cur = cnx.cursor(prepared=True)
name_var_with_wildcards = '%{0}%'.format(name_var)
cur.execute(sql, (name_var_with_wildcards,))
如果您的 name_var 可能包含文字 LIKE 通配符 %
和 _
,您需要对它们进行转义:
sql = """SELECT ... WHERE t.name LIKE CONCAT('%', %s, '%')"""
cur = cnx.cursor(prepared=True)
name_var_escaped = re.sub(r'([_%])', r'\\\1', name_var)
cur.execute(sql, (name_var_escaped,))
关于mysql - 使用 python 2.7 和 MySQLdb 的动态 LIKE 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43372897/