Skip to content

Commit 1bc8386

Browse files
committed
fix: Cross-Workspace Recommended-Problem Read and Overwrite (IDOR)
1 parent 33c87b6 commit 1bc8386

3 files changed

Lines changed: 15 additions & 10 deletions

File tree

‎backend/apps/datasource/api/recommended_problem.py‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
save_recommended_problem, get_datasource_recommended_base
66
from apps.datasource.models.datasource import RecommendedProblemBase
77
from apps.swagger.i18n import PLACEHOLDER_PREFIX
8+
from apps.system.schemas.permission import SqlbotPermission, require_permissions
89
from common.audit.models.log_model import OperationType, OperationModules
910
from common.audit.schemas.logger_decorator import LogConfig, system_log
1011
from common.core.deps import SessionDep, CurrentUser
@@ -13,19 +14,22 @@
1314

1415

1516
@router.get("/get_datasource_recommended/{ds_id}", response_model=None, summary=f"{PLACEHOLDER_PREFIX}rp_get")
16-
async def datasource_recommended(session: SessionDep, ds_id: int):
17+
@require_permissions(permission=SqlbotPermission(type='ds', keyExpression="ds_id"))
18+
async def datasource_recommended(session: SessionDep, user: CurrentUser, ds_id: int):
1719
return get_datasource_recommended(session, ds_id)
1820

1921

2022
@router.get("/get_datasource_recommended_base/{ds_id}", response_model=None, summary=f"{PLACEHOLDER_PREFIX}rp_base")
21-
async def datasource_recommended(session: SessionDep, ds_id: int):
23+
@require_permissions(permission=SqlbotPermission(type='ds', keyExpression="ds_id"))
24+
async def datasource_recommended_base(session: SessionDep, user: CurrentUser, ds_id: int):
2225
return get_datasource_recommended_base(session, ds_id)
2326

2427

2528
@router.post("/save_recommended_problem", response_model=None, summary=f"{PLACEHOLDER_PREFIX}rp_save")
29+
@require_permissions(permission=SqlbotPermission(type='ds', keyExpression="data_info.datasource_id"))
2630
@system_log(
2731
LogConfig(operation_type=OperationType.UPDATE, module=OperationModules.DATASOURCE,
2832
resource_id_expr="data_info.datasource_id"))
29-
async def datasource_recommended(session: SessionDep, user: CurrentUser, data_info: RecommendedProblemBase):
33+
async def datasource_recommended_save(session: SessionDep, user: CurrentUser, data_info: RecommendedProblemBase):
3034
update_ds_recommended_config(session, data_info.datasource_id, data_info.recommended_config)
3135
return save_recommended_problem(session, user, data_info)

‎backend/apps/datasource/crud/datasource.py‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,10 @@ def update_ds(session: SessionDep, trans: Trans, user: CurrentUser, ds: CoreData
119119

120120

121121
def update_ds_recommended_config(session: SessionDep, datasource_id: int, recommended_config: int):
122-
record = session.exec(select(CoreDatasource).where(CoreDatasource.id == datasource_id)).first()
123-
record.recommended_config = recommended_config
124-
session.add(record)
122+
# 使用 update 语句直接更新,避免 ORM 追踪问题
123+
from sqlalchemy import update
124+
stmt = update(CoreDatasource).where(CoreDatasource.id == datasource_id).values(recommended_config=recommended_config)
125+
session.execute(stmt)
125126
session.commit()
126127

127128

‎backend/apps/datasource/crud/recommended_problem.py‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@ def get_datasource_recommended_chart(session: SessionDep, ds_id: int):
1919

2020

2121
def get_datasource_recommended_base(session: SessionDep, ds_id: int):
22-
statement = select(CoreDatasource.id,CoreDatasource.recommended_config).where(CoreDatasource.id == ds_id)
22+
statement = select(CoreDatasource.id, CoreDatasource.recommended_config).where(CoreDatasource.id == ds_id)
2323
datasourceBase = session.exec(statement).first()
2424
if datasourceBase is None:
25-
return RecommendedProblemResponse(ds_id,0,None)
25+
return RecommendedProblemResponse(ds_id, 0, None)
2626
elif datasourceBase.recommended_config == 1:
27-
return RecommendedProblemResponse(ds_id,1,None)
27+
return RecommendedProblemResponse(ds_id, 1, None)
2828
else:
2929
dsRecommendedProblems = session.exec(select(DsRecommendedProblem.question).where(DsRecommendedProblem.datasource_id == ds_id)).all()
30-
return RecommendedProblemResponse(ds_id,datasourceBase.recommended_config, orjson.dumps(dsRecommendedProblems).decode())
30+
return RecommendedProblemResponse(ds_id, datasourceBase.recommended_config, orjson.dumps(dsRecommendedProblems).decode())
3131

3232
def save_recommended_problem(session: SessionDep,user: CurrentUser, data_info: RecommendedProblemBase):
3333
session.query(DsRecommendedProblem).filter(DsRecommendedProblem.datasource_id == data_info.datasource_id).delete(synchronize_session=False)

0 commit comments

Comments
 (0)