使用 execute() 执行多个 SQL 语句
Posted
技术标签:
【中文标题】使用 execute() 执行多个 SQL 语句【英文标题】:Executing Multiple SQL statements using execute() 【发布时间】:2020-09-27 21:12:23 【问题描述】:我正在尝试在我的服务器中创建SQL injection
。
我正在使用命令:
cursor.execute("select * from some_table")
在我的服务器中执行 SQL 命令。
但是有没有办法使用相同的execute()
函数来执行多个命令。
我试过了:
cursor.execute("select * from some_table ; INSERT INTO ...")
DBMS 是mariadb
【问题讨论】:
不,它一次只允许执行一条语句。 多次拨打cursor.execute()
即可。
您可以查看executemany
,例如,它可用于在一次调用中插入多行数据,比多次调用更有效。
【参考方案1】:
mysql(和 MariaDB)允许您通过在连接到数据库服务器时设置 capability flag CLIENT_MULTI_STATEMENTS
(0x10000) 来一次性运行多个 SQL 语句。查看您实现中使用的python数据库驱动程序的文档,应该有设置标志的方法,您需要在创建游标和执行SQL语句之前提前这样做。
这是mariadb
python 驱动的代码示例,对于其他驱动(如pymysql
),它们的工作方式可能相同
import mariadb
from mariadb.constants.CLIENT import MULTI_STATEMENTS
conn_params=
"user" : "YOUR_USERNAME",
"password" : "YOUR_PASSWORD",
"host" : "NETWORK_DOMAIN_NAME",
"database" : "DB_NAME",
"client_flag": MULTI_STATEMENTS,
db_conn = mariadb.connect(**conn_params)
rawsqls = [
'SELECT * FROM table2',
'INSERT INTO table3 ....',
'SELECT * FROM table4',
]
with db_conn.cursor() as cursor:
cursor.execute(';'.join(rawsqls))
rows1 = cursor.fetchall()
cursor.nextset()
rows2 = cursor.fetchall()
cursor.nextset()
rows3 = cursor.fetchall()
注意
为避免 SQL 注入,您应该小心并仅在您非常确定 SQL 语句的所有输入都来自受信任的来源时才使用标志 CLIENT_MULTI_STATEMENTS
。
【讨论】:
【参考方案2】:Here 是 SQL 注入策略的概述。您正在尝试执行的操作称为堆叠查询。似乎大多数数据库 API 至少阻止了这种策略。
你提到的 MariaDB 基本上和 MySQL 差不多。
虽然没有明确列出 python,但我也假设 python 数据库 API 可以防止查询堆叠。
更新:当您检查execute()
的API 时,您可以看到有一个参数multi
,默认为False
。只要不设置为True
,应该是安全的。
【讨论】:
以上是关于使用 execute() 执行多个 SQL 语句的主要内容,如果未能解决你的问题,请参考以下文章
使用java语句类的单个execute()方法执行多个hive查询
executeexecuteQuery和executeUpdate之间的区别
a5m2连接oracle数据库,要执行多个update语句,怎么开启事务,sql语句?