我的理解是,SQL注入通常很糟糕。这很好,如PEP 249中所述,您可以使用占位符来防止大多数通用注入。但是我没有看到任何关于如何进行涉及LIKE动态的查询的说法。
我的具体情况是我有一个ajax调用,它在输入更改到Name字段时运行。结果是我的查询结果被过滤WHERE table.name LIKE name_var
作为简单表示。显然直接在name_var中加入查询是非常危险的,你们中的一些人甚至可能看到了这一点。但是,我如何使这安全和动态?我是否构建了自己的解析器? MySQLdb是否有一些内置功能来处理这个问题?我似乎找不到太多有用的信息,所以我很感激你的帮助。
答案 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,))