使用 execute() 执行多个 SQL 语句
Executing Multiple SQL statements using execute()
我正在尝试在我的服务器中执行 SQL injection
。
我正在使用命令:
cursor.execute("select * from some_table")
在我的服务器中执行 SQL 命令。
但是有没有办法使用相同的 execute()
函数执行多个命令。
我试过了:
cursor.execute("select * from some_table ; INSERT INTO ...")
DBMS 是 mariadb
Here 是 SQL 注入策略的概述。您尝试执行的操作称为 堆叠查询 。似乎至少大多数数据库都阻止了这种策略 APIs.
你提到的 MariaDB 与 MySQL 基本相同。
虽然 python 没有明确列出,但我也假设 python 数据库 API 防止查询堆叠。
更新: 当你检查 execute()
的 API 时,你可以看到有一个参数 multi
默认为 False
.只要不设置为True
,应该是安全的。
MySQL(和 MariaDB)允许您通过在连接到 capability flag CLIENT_MULTI_STATEMENTS
(0x10000)数据库服务器。查看您实现中使用的 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
。
我正在尝试在我的服务器中执行 SQL injection
。
我正在使用命令:
cursor.execute("select * from some_table")
在我的服务器中执行 SQL 命令。
但是有没有办法使用相同的 execute()
函数执行多个命令。
我试过了:
cursor.execute("select * from some_table ; INSERT INTO ...")
DBMS 是 mariadb
Here 是 SQL 注入策略的概述。您尝试执行的操作称为 堆叠查询 。似乎至少大多数数据库都阻止了这种策略 APIs.
你提到的 MariaDB 与 MySQL 基本相同。
虽然 python 没有明确列出,但我也假设 python 数据库 API 防止查询堆叠。
更新: 当你检查 execute()
的 API 时,你可以看到有一个参数 multi
默认为 False
.只要不设置为True
,应该是安全的。
MySQL(和 MariaDB)允许您通过在连接到 capability flag CLIENT_MULTI_STATEMENTS
(0x10000)数据库服务器。查看您实现中使用的 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
。