쿼리 에서 cud 명령어 막기 구현
This commit is contained in:
@@ -22,6 +22,61 @@ import { DatabaseConnectorFactory } from "../database/DatabaseConnectorFactory";
|
||||
import { ExternalDbConnectionService } from "./externalDbConnectionService";
|
||||
|
||||
export class ReportService {
|
||||
/**
|
||||
* SQL 쿼리 검증 (SELECT만 허용)
|
||||
*/
|
||||
private validateQuerySafety(sql: string): void {
|
||||
// 위험한 SQL 명령어 목록
|
||||
const dangerousKeywords = [
|
||||
"DELETE",
|
||||
"DROP",
|
||||
"TRUNCATE",
|
||||
"INSERT",
|
||||
"UPDATE",
|
||||
"ALTER",
|
||||
"CREATE",
|
||||
"REPLACE",
|
||||
"MERGE",
|
||||
"GRANT",
|
||||
"REVOKE",
|
||||
"EXECUTE",
|
||||
"EXEC",
|
||||
"CALL",
|
||||
];
|
||||
|
||||
// SQL을 대문자로 변환하여 검사
|
||||
const upperSql = sql.toUpperCase().trim();
|
||||
|
||||
// 위험한 키워드 검사
|
||||
for (const keyword of dangerousKeywords) {
|
||||
// 단어 경계를 고려하여 검사 (예: DELETE, DELETE FROM 등)
|
||||
const regex = new RegExp(`\\b${keyword}\\b`, "i");
|
||||
if (regex.test(upperSql)) {
|
||||
throw new Error(
|
||||
`보안상의 이유로 ${keyword} 명령어는 사용할 수 없습니다. SELECT 쿼리만 허용됩니다.`
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// SELECT 쿼리인지 확인
|
||||
if (!upperSql.startsWith("SELECT") && !upperSql.startsWith("WITH")) {
|
||||
throw new Error(
|
||||
"SELECT 쿼리만 허용됩니다. 데이터 조회 용도로만 사용할 수 있습니다."
|
||||
);
|
||||
}
|
||||
|
||||
// 세미콜론으로 구분된 여러 쿼리 방지
|
||||
const semicolonCount = (sql.match(/;/g) || []).length;
|
||||
if (
|
||||
semicolonCount > 1 ||
|
||||
(semicolonCount === 1 && !sql.trim().endsWith(";"))
|
||||
) {
|
||||
throw new Error(
|
||||
"보안상의 이유로 여러 개의 쿼리를 동시에 실행할 수 없습니다."
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 리포트 목록 조회
|
||||
*/
|
||||
@@ -674,6 +729,9 @@ export class ReportService {
|
||||
connectionId = queryResult.external_connection_id;
|
||||
}
|
||||
|
||||
// SQL 쿼리 안전성 검증 (SELECT만 허용)
|
||||
this.validateQuerySafety(sql_query);
|
||||
|
||||
// 파라미터 배열 생성 ($1, $2 순서대로)
|
||||
const paramArray: any[] = [];
|
||||
for (const param of queryParameters) {
|
||||
|
||||
Reference in New Issue
Block a user