使用 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