2017-04-12 55 views
1

我的理解是,SQL注入通常是不好的。这很好,正如PEP 249所述,您可以使用占位符来防止大多数通用注射。然而,我没有看到如何使涉及LIKE的查询动态化。使用python 2.7和MySQLdb进行动态LIKE查询

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

回答

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,)) 
+0

哦真棒,我想我可以做一些这种效果,但没有运气。我会把这只兔子全部下来,看看它是从哪里来的。谢谢! – Turk