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 문을 실행하기 전에 플래그를 미리 설정해야 합니다.
다음은 의 코드 예시입니다.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 주입을 방지하려면 주의하여 플래그를 사용해야 합니다.CLIENT_MULTI_STATEMENTS
SQL 문에 대한 모든 입력이 신뢰할 수 있는 원본에서 나온다고 확신할 수 있는 경우에만 해당됩니다.
언급URL : https://stackoverflow.com/questions/62269948/executing-multiple-sql-statements-using-execute
'programing' 카테고리의 다른 글
PHP 루프 - SQL 성능 저하 (0) | 2022.09.26 |
---|---|
numpy 배열이 비어 있는지 확인하려면 어떻게 해야 합니까? (0) | 2022.09.26 |
잘못된 후크 호출입니다.후크는 기능 구성 요소의 본체 내부에서만 호출할 수 있습니다. (0) | 2022.09.26 |
가장 가까운 정수로 반올림 (0) | 2022.09.26 |
document.getElementById vs jQuery $() (0) | 2022.09.26 |