[mysql-connector-python在将表作为参数传递时,在表名周围添加单引号。表名来自Flask会话变量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[mysql-connector-python在将表作为参数传递时,在表名周围添加单引号。表名来自Flask会话变量相关的知识,希望对你有一定的参考价值。
我不熟悉mysql,正在构建Flask项目,并使用mysql.connector
查询MySQL数据库。我知道这个问题已经被回答过很多次了,但这更具体地讲是结合MySQL与Flask一起使用。
我需要传递一个查询,在该查询中我要动态地将表名称插入查询中,具体取决于存储在Flask中session
变量中的值。但是问题是,如果我尝试这样做:
方法1:
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:
cur.execute('SELECT * FROM '+session['table_name']+';')
[我猜这是可行的,但是它不能逃脱SQL注入,因为它是直接串联的,与方法1不同,方法[1] cur.execute()
函数根据this question处理转义。
传递的值存储在Flask的session变量中,根据Miguel's Video,它不太安全。因此,我想转义该字符串,而不会触发错误。
是否有可能以不添加引号的方式实现方法1,或者使用某些函数对字符串进行转义?还是其他可以更好地解决此问题的Python / Flask软件包?
或者,如果没有任何效果,使用正则表达式手动检查SQL注入是否是更明智的选择?
提前感谢。
注意:此mysql.connector
的程序包名称是mysql-connector-python
,而不是其他任何相同的探测程序包。
对于标识符,您可以使用类似:
table_name = conn.converter.escape(session['table_name'])
cur.execute('SELECT * FROM ``'.format(table_name))
对于值占位符,可以通过使用cur.execute()
方法中的参数来使用方法1。它们将被转义并引用。
https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html中的更多详细信息
NOTE:您不需要以;
]结尾SQL语句
以上是关于[mysql-connector-python在将表作为参数传递时,在表名周围添加单引号。表名来自Flask会话变量的主要内容,如果未能解决你的问题,请参考以下文章
找不到任何满足 mysql-connector-python 要求的下载
我无法使用 pip 安装 mysql-connector-python
无法使用 mysql-connector-python 连接到 localhost,错误 1130
无法在 virtualenv 中安装 mysql-connector-python