mysql - 使用 python 2.7 和 MySQLdb 的动态 LIKE 查询

标签 mysql python-2.7 mysql-python dynamicquery

据我了解,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/

相关文章:

mysql - 在mysql中搜索重音字符

mysql - 强制 INNER JOIN/LEFT JOIN 优先级和组

python - 如何发出 python 请求、加载 javascript、填写表单并单击提交

python - 使用python在mysql中插入字符串: unknown column

python - 如何在 Python 2.6 的 Linux 系统上通过 pip/virtualenv 为 Python 2.5 安装 MySQL-python?

php - php 中的 if 语句使用日期

C# 在选择查询中使用函数来解密表数据

python - Python 中的 Zip 列表

python - 从二进制图像中提取形状/多边形?

Python mysqldb fetchmany 无法正常工作