我是MySQL的新手,我正在构建一个MySQL项目,并使用mysql.connector查询MySQL数据库。我知道这个问题以前已经回答过很多次了,但这是更具体的使用MySQL与烧瓶。
我需要传递一个查询,根据在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那样,cur.execute()函数按照这个问题处理转义。
传递的值存储在米格尔录像中的一个会话变量中,这个变量不太安全。因此,我想转义该字符串,而不触发错误。
是否有可能以不添加引号的方式实现方法1,或者使用某种函数转义字符串?或者其他任何能够更好地处理这个问题的Python/Flask包?
或者,如果没有效果,使用regex手动检查SQL注入是一个更明智的选择吗?
提前谢谢。
注意:这个mysql.connector的包名是mysql-connector-python,而不是任何其他听起来相同的包。
发布于 2020-05-19 18:00:14
对于标识符,可以使用以下内容:
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的更多细节
注意到:您不需要用;结束;语句
https://stackoverflow.com/questions/61704233
复制相似问题