[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

安装python官方的mysql库“mysql-connector-python”

配置 .travis.yml 以支持 mysql-connector-python