使用python 2.7和MySQLdb进行动态LIKE查询

时间:2017-04-12 14:47:39

标签: mysql python-2.7 mysql-python dynamicquery

我的理解是,SQL注入通常很糟糕。这很好,如PEP 249中所述,您可以使用占位符来防止大多数通用注入。但是我没有看到任何关于如何进行涉及LIKE动态的查询的说法。

我的具体情况是我有一个ajax调用,它在输入更改到Name字段时运行。结果是我的查询结果被过滤WHERE table.name LIKE name_var作为简单表示。显然直接在name_var中加入查询是非常危险的,你们中的一些人甚至可能看到了这一点。但是,我如何使这安全和动态?我是否构建了自己的解析器? MySQLdb是否有一些内置功能来处理这个问题?我似乎找不到太多有用的信息,所以我很感激你的帮助。

1 个答案:

答案 0 :(得分:1)

是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,))