首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当表作为参数传递时,mysql连接器-python在表名周围添加单引号。表名来自Flask会话变量

当表作为参数传递时,mysql连接器-python在表名周围添加单引号。表名来自Flask会话变量
EN

Stack Overflow用户
提问于 2020-05-09 21:52:39
回答 1查看 395关注 0票数 0

我是MySQL的新手,我正在构建一个MySQL项目,并使用mysql.connector查询MySQL数据库。我知道这个问题以前已经回答过很多次了,但这是更具体的使用MySQL与烧瓶。

我需要传递一个查询,根据在session变量中存储的值,动态地将表名插入到查询中。但问题是,如果我尝试这样做:

方法1:

代码语言:javascript
复制
cur.execute('SELECT * FROM %s;',(session['table_name'],))

数据库抛出一个错误,说明找不到这样的表。但是,问题是mysql.connector一直用单引号包围表名,因此出现了错误。

示例错误声明:

mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''52_data'' at line 1

这里的表名应该是52_data,而不是'52_data'

只有其他解决办法,我想,是使用:

方法2:

代码语言:javascript
复制
cur.execute('SELECT * FROM '+session['table_name']+';')

它正在工作,但我猜它不会转义SQL注入,因为它是直接连接的,不像方法1那样,cur.execute()函数按照这个问题处理转义。

传递的值存储在米格尔录像中的一个会话变量中,这个变量不太安全。因此,我想转义该字符串,而不触发错误。

是否有可能以不添加引号的方式实现方法1,或者使用某种函数转义字符串?或者其他任何能够更好地处理这个问题的Python/Flask包?

或者,如果没有效果,使用regex手动检查SQL注入是一个更明智的选择吗?

提前谢谢。

注意:这个mysql.connector的包名是mysql-connector-python,而不是任何其他听起来相同的包。

EN

回答 1

Stack Overflow用户

发布于 2020-05-19 18:00:14

对于标识符,可以使用以下内容:

代码语言:javascript
复制
table_name = conn.converter.escape(session['table_name'])
cur.execute('SELECT * FROM `{}`'.format(table_name))

对于值占位符,可以使用方法1,方法是使用cur.execute()方法中的参数。他们将被逃脱和引用。

关于https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html的更多细节

注意到:您不需要用;结束;语句

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61704233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档