programing

execute()를 사용한 여러 SQL 문의 실행

bestcode 2022. 9. 26. 23:07
반응형

execute()를 사용한 여러 SQL 문의 실행

제가 지금 하고 있는 건SQL injection제 서버에 있어요.다음 명령을 사용하고 있습니다.

cursor.execute("select * from some_table")

SQL 명령어를 실행할 수 있습니다.그러나 동일한 명령어를 사용하여 여러 명령을 실행할 수 있는 방법이 있습니까?execute()기능.
시도했습니다.

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

DBMS는mariadb

다음은 SQL 주입 전략의 개요입니다.이를 스태킹 쿼리라고 합니다.적어도 이 전략은 대부분의 데이터베이스 API에 의해 방지되고 있는 것 같습니다.

MySQL과 기본적으로 동일한 MariaDB를 언급하셨습니다.

python은 명시적으로 리스트 되어 있지 않지만 python 데이터베이스 API가 쿼리 스태킹을 방해하고 있다고 생각합니다.

업데이트: 의 API를 확인했을 때execute()파라미터가 있는 것을 볼 수 있습니다.multi디폴트로는False로 설정하지 않는 한True, 당신은 안전할 것입니다.

MySQL(및 MariaDB)에서는 기능 플래그를 설정하여 여러 SQL 문을 한 번에 실행할 수 있습니다. CLIENT_MULTI_STATEMENTS(0x420)을 클릭합니다.구현에 사용되는 python 데이터베이스 드라이버의 설명서를 참조하십시오. 플래그를 설정하는 방법이 있어야 하며 커서를 만들고 SQL 문을 실행하기 전에 플래그를 미리 설정해야 합니다.

다음은 의 코드 예시입니다.mariadbpython 드라이버, 기타 드라이버용(예: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 주입을 방지하려면 주의하여 플래그를 사용해야 합니다.CLIENT_MULTI_STATEMENTSSQL 문에 대한 모든 입력이 신뢰할 수 있는 원본에서 나온다고 확신할 수 있는 경우에만 해당됩니다.

언급URL : https://stackoverflow.com/questions/62269948/executing-multiple-sql-statements-using-execute

반응형