首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

ORA-00922 深度解析:從明文密碼漏洞到 SQL*Plus 置換變量陷阱

     編輯:Oracle 資料庫基礎

錯誤定義

ORA-00922: missing or invalid option — 定義欄位或儲存子句時指定了無效選項。合法的欄位選項僅 NOT NULL;DATE/LONG 指定長度也會觸發此錯誤。

案例一:Oracle 10g Application Server 明文密碼漏洞 (CVE 相關)

影響版本

  • Oracle 10g AS 9.0.4.0
  • Oracle 10g AS 10.1.0.2

漏洞詳情

  1. $ORACLE_HOME/hostname_sid/sysman/config/emoms.properties 全域可讀,含 SYSMAN 明文密碼。
  2. 安裝時若 SYS/SYSTEM/DBSNMP/SYSMAN 密碼相同且含驚嘆號 (如 f00bar!!),postDBCreation.log 會記錄失敗的 ALTER USER ... IDENTIFIED BY f00bar!! 並顯示 ORA-00922,導致密碼洩露。

修補建議

  • 套用 Oracle Metalink Patch #68。
  • 限制 emoms.properties 權限,避免密碼含特殊字元。

案例二:SQL*Plus 置換變量引號缺失導致 ORA-00922

錯誤腳本片段

PROMPT ACCEPT in_beg_date PROMPT 'Enter beginning extract date mm/dd/yy '
PROMPT ACCEPT in_end_date PROMPT 'Enter ending extract date mm/dd/yy '
DECLARE
  beg_date VARCHAR2(8) := &in_beg_date;
  end_date VARCHAR2(8) := &in_end_date;
BEGIN
  beg_dte := TO_DATE(beg_date, 'MM/DD/YY');
  ...
  IF (outrec_abs_date >= beg_dte and <= end_dte) THEN ...

根因

SQL*Plus 將 &in_beg_date 直接置換為使用者輸入的 09/01/03,產生 beg_date VARCHAR2(8) := 09/01/03;。這被視為數值運算式 (9/1)/3 = 3,而非字串常值,導致語法錯誤。

正確寫法

beg_date VARCHAR2(8) := '&in_beg_date';
end_date VARCHAR2(8) := '&in_end_date';

單引號不可省略,確保置換後仍為合法字串常值。

最佳實務提醒

  • PROMPT 僅列印提示訊息;ACCEPT 等待輸入並建立置換變量,兩者皆為 SQL*Plus 命令,須置於 PL/SQL 區塊外。
  • 開啟 SET VERIFY ON (預設) 可看到 old/new 置換對照,利於除錯。
  • 所有經由 &var 置換進 PL/SQL 的字串/日期常值,務必在腳本中預先加上單引號。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved