首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle SYS_CONTEXT 實戰:獲取 Session 環境屬性與 SQL 注入防禦應用

     編輯:Oracle 資料庫相關知識

SYS_CONTEXT 基本語法


SYS_CONTEXT(namespace, attribute [, length])
  • namespace:命名空間 (如 USERENV、自訂)
  • attribute:屬性名稱
  • length:回傳值最大長度 (1~4000,預設 256)
  • 回傳 VARCHAR2,Session 級別屬性

內建 USERENV 命名空間完整屬性表

屬性說明範例值長度
SESSION_USER當前驗證使用者SCOTT30
SESSION_USERID當前使用者 ID12330
CURRENT_USER當前權限擁有者 (Definer's Rights 為擁有者)SYS30
CURRENT_USERID當前權限擁有者 ID030
PROXY_USERProxy 連線使用者APP_USER30
PROXY_USERIDProxy 使用者 ID45630
ISDBA是否啟用 DBA 角色TRUE/FALSE30
AUTHENTICATION_TYPE驗證類型DATABASE, OS, NETWORK, PROXY30
AUTHENTICATION_DATA驗證資料 (X.509 憑證 HEX)...256/4000
TERMINAL客戶端終端機識別WORKSTATION154
HOST客戶端主機名db-server-0154
IP_ADDRESS客戶端 IP192.168.1.10030
NETWORK_PROTOCOL網路協定TCP256
LANGUAGE語言_地區.字元集AMERICAN_AMERICA.AL32UTF852
LANGISO 語言縮寫US62
NLS_TERRITORY地區設定AMERICA62
NLS_CURRENCY貨幣符號$62
NLS_CALENDAR行曆類型GREGORIAN62
NLS_DATE_FORMAT日期格式YYYY-MM-DD62
NLS_DATE_LANGUAGE日期語言AMERICAN62
NLS_SORT排序基礎BINARY62
DB_NAME資料庫名稱ORCL30
DB_DOMAIN資料庫網域example.com256
INSTANCE執行個體編號130
INSTANCE_NAME執行個體名稱orcl30
SERVER_HOST伺服器主機名db-server-0154
MODULE應用模組名 (DBMS_APPLICATION_INFO)OrderEntry64
ACTION應用動作名InsertOrder64
CLIENT_INFO用戶端資訊 (64 bytes)user_session_12364
ENTRYID稽核項目 ID1234530
SESSIONID稽核 Session ID9876530
FG_JOB_ID前景作業 ID12330
BG_JOB_ID背景作業 IDNULL30
EXTERNAL_NAME外部名稱 (SSL 憑證 DN)CN=Scott,O=Oracle256

一鍵查詢所有 USERENV 屬性


SELECT 
  SYS_CONTEXT('USERENV','SESSION_USER')         AS session_user,
  SYS_CONTEXT('USERENV','SESSION_USERID')       AS session_userid,
  SYS_CONTEXT('USERENV','CURRENT_USER')         AS current_user,
  SYS_CONTEXT('USERENV','CURRENT_USERID')       AS current_userid,
  SYS_CONTEXT('USERENV','PROXY_USER')           AS proxy_user,
  SYS_CONTEXT('USERENV','ISDBA')                AS isdba,
  SYS_CONTEXT('USERENV','AUTHENTICATION_TYPE')  AS auth_type,
  SYS_CONTEXT('USERENV','TERMINAL')             AS terminal,
  SYS_CONTEXT('USERENV','HOST')                 AS host,
  SYS_CONTEXT('USERENV','IP_ADDRESS')           AS ip_address,
  SYS_CONTEXT('USERENV','NETWORK_PROTOCOL')     AS net_protocol,
  SYS_CONTEXT('USERENV','LANGUAGE')             AS language,
  SYS_CONTEXT('USERENV','DB_NAME')              AS db_name,
  SYS_CONTEXT('USERENV','INSTANCE')             AS instance,
  SYS_CONTEXT('USERENV','MODULE')               AS module,
  SYS_CONTEXT('USERENV','ACTION')               AS action
FROM dual;

應用場景:SQL 注入環境偵測

攻擊者常注入 SYS_CONTEXT('USERENV','...') 探測環境:


-- 偵測是否為 DBA
' OR SYS_CONTEXT('USERENV','ISDBA')='TRUE' --

-- 取得資料庫名稱
' || SYS_CONTEXT('USERENV','DB_NAME') || '

-- 取得 IP 判斷內外網
' || SYS_CONTEXT('USERENV','IP_ADDRESS') || '

防禦措施

  1. 參數化查詢:使用 Bind Variable,杜絕字串拼接
  2. 最小權限帳號:應用使用非 DBA 帳號,ISDBA=FALSE
  3. 審計 SYS_CONTEXT 存取:AUDIT EXECUTE ON SYS.SYS_CONTEXT BY ACCESS
  4. WAF/資料庫防火牆:攔截含 SYS_CONTEXT 的異常查詢
  5. 限制 USERENV 敏感屬性:自訂 Context 替代、或使用 VPD 隱藏

自訂 Context 實戰


-- 1. 建立 Context 命名空間
CREATE OR REPLACE CONTEXT app_ctx USING app_ctx_pkg;

-- 2. 建立管理套件
CREATE OR REPLACE PACKAGE app_ctx_pkg IS
  PROCEDURE set_tenant(p_tenant_id NUMBER);
  PROCEDURE clear_tenant;
END;
/

CREATE OR REPLACE PACKAGE BODY app_ctx_pkg IS
  PROCEDURE set_tenant(p_tenant_id NUMBER) IS
  BEGIN
    DBMS_SESSION.SET_CONTEXT('APP_CTX', 'TENANT_ID', p_tenant_id);
  END;
  
  PROCEDURE clear_tenant IS
  BEGIN
    DBMS_SESSION.CLEAR_CONTEXT('APP_CTX', 'TENANT_ID');
  END;
END;
/

-- 3. 使用 (VPD/RLS 政策中)
CREATE FUNCTION tenant_policy(p_schema VARCHAR2, p_obj VARCHAR2) RETURN VARCHAR2 IS
BEGIN
  RETURN 'tenant_id = ' || SYS_CONTEXT('APP_CTX', 'TENANT_ID');
END;
/

-- 4. 應用登入時設定
BEGIN
  app_ctx_pkg.set_tenant(123);
END;
/

效能與限制

  • 快取機制:Session 內多次呼叫同屬性極快
  • 並行查詢限制:PX 從程序無法存取 Session Context
  • RAC 環境:Context 為 Instance 級,跨節點需同步
  • 長度限制:單屬性 4000 bytes,總大小受 SESSION_CONTEXT_SIZE 限制

常見錯誤

錯誤原因解決
ORA-01403: no data foundContext 未設定該屬性檢查 SET_CONTEXT 是否執行、命名空間正確
ORA-01031: insufficient privileges無 CREATE CONTEXT 權限GRANT CREATE CONTEXT TO user
回傳 NULL屬性名拼錯、大小寫 (不區分大小寫但建議大寫)核對 USERENV 拼寫
截斷超過 length 參數或預設 256明確指定 length => 4000
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved