Skip to content

Commit f33188a

Browse files
committed
fix: check sql only contain read operation #814
1 parent 99aa6a2 commit f33188a

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

backend/apps/db/db.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
import os
44
import platform
55
import urllib.parse
6-
from decimal import Decimal
76
from datetime import timedelta
7+
from decimal import Decimal
88
from typing import Optional
99

1010
import oracledb
@@ -32,6 +32,8 @@
3232
from fastapi import HTTPException
3333
from apps.db.es_engine import get_es_connect, get_es_index, get_es_fields, get_es_data_by_http
3434
from common.core.config import settings
35+
import sqlglot
36+
from sqlglot import expressions as exp
3537

3638
try:
3739
if os.path.exists(settings.ORACLE_CLIENT_PATH):
@@ -464,6 +466,9 @@ def convert_value(value):
464466
def exec_sql(ds: CoreDatasource | AssistantOutDsSchema, sql: str, origin_column=False):
465467
while sql.endswith(';'):
466468
sql = sql[:-1]
469+
# check execute sql only contain read operations
470+
if not check_sql_read(sql):
471+
raise ValueError(f"SQL can only contain read operations")
467472

468473
db = DB.get_db(ds.type)
469474
if db.connect_type == ConnectType.sqlalchemy:
@@ -569,3 +574,29 @@ def exec_sql(ds: CoreDatasource | AssistantOutDsSchema, sql: str, origin_column=
569574
"sql": bytes.decode(base64.b64encode(bytes(sql, 'utf-8')))}
570575
except Exception as ex:
571576
raise Exception(str(ex))
577+
578+
579+
def check_sql_read(sql: str, dialect=None):
580+
try:
581+
582+
statements = sqlglot.parse(sql, dialect=dialect)
583+
584+
if not statements:
585+
raise ValueError("Parse SQL Error")
586+
587+
write_types = (
588+
exp.Insert, exp.Update, exp.Delete,
589+
exp.Create, exp.Drop, exp.Alter,
590+
exp.Merge, exp.Command
591+
)
592+
593+
for stmt in statements:
594+
if stmt is None:
595+
continue
596+
if isinstance(stmt, write_types):
597+
return False
598+
599+
return True
600+
601+
except Exception as e:
602+
raise ValueError(f"Parse SQL Error: {e}")

backend/pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ dependencies = [
5252
"redshift-connector>=2.1.8",
5353
"elasticsearch[requests] (>=7.10,<8.0)",
5454
"ldap3>=2.9.1",
55+
"sqlglot>=28.6.0",
5556
]
5657

5758
[project.optional-dependencies]

0 commit comments

Comments
 (0)