Vì hệ thống trực tiếp thực thi câu lệnh SQL do AI (LLM) sinh ra, rủi ro về bảo mật là rất lớn. Bất kì AI nào cũng có nguy cơ bị Prompt Injection để drop bảng hoặc đánh cắp dữ liệu.

Hệ thống có hai lớp phòng vệ (Guardrails) chính, được triển khai tại file `backend/agent/sql_agent/core.py`.

### 1. Hàm `validate_sql` (Regex Filter)

Mọi câu lệnh trước khi chạy đều phải lọt qua hàm kiểm tra `_validate_sql`:

```python
_FORBIDDEN_PATTERNS = re.compile(
    r"\b(INSERT|UPDATE|DELETE|DROP|ALTER|CREATE|TRUNCATE|REPLACE|MERGE|GRANT|REVOKE)\b",
    re.IGNORECASE,
)

def validate_sql(sql: str) -> str | None:
    sql_clean = sql.strip().rstrip(";")
    upper_sql = sql_clean.upper()
    
    # 1. Chặn toàn bộ các câu không bắt đầu bằng SELECT/WITH/SHOW
    if not any(upper_sql.startswith(k) for k in ("SELECT", "WITH", "SHOW")):
        return "Only SELECT, WITH, or SHOW queries allowed"
        
    # 2. Chặn các lệnh sửa đổi cấu trúc (DML/DDL)
    match = _FORBIDDEN_PATTERNS.search(sql_clean)
    if match:
        return f"Forbidden SQL keyword: {match.group()}"
        
    # 3. Bảo vệ cột Vector Embedding (Ngăn memory crash do data quá lớn)
    check_str = sql_clean.lower().replace("_text_embedding", "")
    if re.search(r'\b(embedding|vector)\b', check_str):
        return "Cannot query embedding/vector column"
        
    return None
```

### 2. Read-Only DB Connection

Ở tầng mạng và cấu hình Cơ sở dữ liệu:
- Mật khẩu và user kết nối StarRocks (`StarRocksConnection`) và Postgres (`PostgresReadonly`) phải được cấp quyền ở mức độ cực kỳ hạn chế (Least Privilege). 
- Các User DB này chỉ có quyền `SELECT`, và thường bị limit resource tiêu thụ trên cụm DB để tránh tấn công DoS qua AI.

### 3. Human-in-the-Loop (Approval)
Đối với những lệnh truy vấn phức tạp hoặc agent đa bước (Trace Agent), API `/api/ai-sql/approve/{session_id}` cho phép kỹ sư con người xem trước chuỗi thao tác của AI và bấm "Accept" hoặc "Reject" trước khi hệ thống chạy các bước nhạy cảm tiếp theo.