添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
重情义的鸵鸟  ·  Using ...·  1 年前    · 
高大的拐杖  ·  java - FFmpeg Javacv ...·  2 年前    · 

使用execute()执行多个SQL语句

1 人关注

我正试图在我的一个服务器上做一个 SQL injection 。 我正在使用命令。

cursor.execute("select * from some_table")

来执行我服务器中的SQL命令。 但是否有办法使用同一个execute()函数来执行多个命令。
I tried :

cursor.execute("select * from some_table ; INSERT INTO ...")

DBMS is mariadb

3 个评论
不,它一次只允许执行一条语句。
只要多次调用 cursor.execute()
Sam
你可以研究一下 executemany ,例如,它可以用来在一次调用中插入多行数据,比多次调用更有效率。
python
sql
mariadb
sql-injection
stacked-query
Roshin Raphel
Roshin Raphel
发布于 2020-06-09
2 个回答
Stefan Winkler
Stefan Winkler
发布于 2021-11-16
已采纳
0 人赞同

Here 是一个关于SQL注入策略的概述。你想做的那个叫做 叠加查询 .看来,至少这种策略被大多数数据库API所阻止。

你提到MariaDB,它基本上与MySQL差不多。

虽然python没有明确列出,但我也认为python的数据库API会阻止查询堆叠。

更新。 当你检查 execute() 的API时,你可以看到有一个参数 multi ,默认为 False 。只要你不把它设置为 True ,你应该是安全的。

Ham
Ham
发布于 2021-11-16
0 人赞同

MySQL(和MariaDB)允许你通过设置一次性运行几个SQL语句 能力标志 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()