为了账号安全,请及时绑定邮箱和手机立即绑定

Python:Mysql Escape 函数生成损坏的查询

Python:Mysql Escape 函数生成损坏的查询

30秒到达战场 2022-06-07 17:05:48
Python mysql 默认转义函数,损坏查询。原始查询字符串如下。它工作正常,并根据需要向数据库添加记录INSERT IGNORE INTO state (`name`, `search_query`, `business_status`, `business_type`, `name_type`, `link`) VALUES ("test_name1", "test", "test_status", "test_b_typ", "test_n_typ", "test_link"), ("test_name2", "test", "test_status", "test_b_typ", "test_n_typ", "test_link")但是在使用功能 safe_sql = self.conn.escape_string(original_sql) safe_sql 将其转义以使 sql Injection 安全之后,正在生成如下b'INSERT IGNORE INTO state (`name`, `search_query`, `business_status`, `business_type`, `name_type`, `link`) VALUES (\\"test_name1\\", \\"test\\", \\"test_status\\", \\"test_b_typ\\", \\"test_n_typ\\", \\"test_link\\"), (\\"test_name2\\", \\"test\\", \\"test_status\\", \\"test_b_typ\\", \\"test_n_typ\\", \\"test_link\\")'现在,如果我尝试执行 safe_sql,我会收到以下语法错误MySQLdb._exceptions.ProgrammingError: (1064, 'You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near \'\\"test_name1\\", \\"test\\", \\"test_status\\", \\"test_b_typ\\", \\"test_n_typ\\", \\"tes\' at line 1')这让我想知道,如果我使用的转义功能损坏/不兼容,或者我没有以正确的方式使用它?此外,我一次输入数百条记录,并且由于与运行数百次的准备好的语句相比,单个查询的快速处理(我纯粹假设),我正在创建一个大型查询。
查看完整描述

1 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

您无法逃避整个查询!您不能通过随机连接字符串来构建查询,然后在其上挥动魔杖并使其“注入安全”。您需要先转义每个单独的值,然后再将其放入查询中。例如:

"INSERT ... VALUES ('%s', ...)" % self.conn.escape_string(foo)

但实际上,您的 MySQL API 可能提供了准备好的语句,这些语句更易于使用且不易出错。就像是:

self.conn.execute('INSERT ... VALUES (%s, %s, %s, ...)',
                  (foo, bar, baz))


查看完整回答
反对 回复 2022-06-07
  • 1 回答
  • 0 关注
  • 75 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信