管理及程式設計指南

巨集開發技術

Net.Data 會提供數種機制,容許使用指定值給輸入變數。 若要確定巨集是以您想要的方式執行,巨集應該驗證這些輸入變數。 在設計您的資料庫及應用程式時,您也應該限制使用者對有權看到的資料的存取權。

當撰寫 Net.Data 巨集時,請使用下列開發技術。 這些技術將協助您確保您的應用程式是按照想要的方式執行,且僅有適當授權的使用者可存取資料。

確定無法在 URL 中置換 Net.Data 變數
使用者在 URL 中設定的 Net.Data 變數值將置換用來起始設定巨集中的變數的 DEFINE 陳述式。 這可能會改變您的巨集的執行方式。若要避免這種可能性, 請使用 DTW_ASSIGN() 函數起始設定 Net.Data 變數。

範例:不要使用 %DEFINE SHOWSQL="NO" 來設定 Net.Data SHOWSQL 變數,請使用 @DTW_ASSIGN(SHOWSQL, "NO")。然後,如 SHOWSQL=YES 查詢字串指定將不會置換巨集設定。

您可以使用下列其中一種方法,讓 SQL 陳述式無法顯示在生產系統中。

請參閱 Net.Data 參考手冊的變數一章中的 SHOWSQL,以取得 SHOWSQL Net.Data 變數的語法及範例。

您也可以使用 DTW_ASSIGN,來確保其它 Net.Data 變數 (如 RPT_MAX_ROWS 或 START_ROW_NUM) 不會被置換。 請參閱 Net.Data 參考手冊中有關變數的章節,以取得這些變數的詳細資訊。

確認無法以更改應用程式行為的方式來修改您的 SQL 陳述式。

新增 Net.Data 變數到巨集內的 SQL 陳述式,將容許使用者在執行 SQL 陳述式之前,可動態更改它。 驗證使用者提供的輸入值是巨集撰寫者的責任,且他要確保含有變數參照的 SQL 陳述式不會遭到不預期的修改。 您的 Net.Data 應用程式應該確認使用者從 URL 提供的輸入值, 以便 Net.Data 應用程式可以拒絕無效的輸入。 您的驗證設計處理應該包括下列步驟:

  1. 識別有效輸入的語法;例如,客戶 ID 須以字母開頭,且僅能含有英數字元。
  2. 判斷容許不正確輸入、有意的破壞輸入或想取得 Net.Data 應用程式的內部資產的輸入,可能帶來的傷害。
  3. 在巨集中包括必須符合應用程式需要的輸入驗證陳述式。如此的驗證取決於輸入的語法及使用方式。 在較簡單的情況中,它足以檢查出輸入中的無效內容,或呼叫 Net.Data 來驗證輸入類型。 如果輸入的語法相當複雜,則巨集開發者可能必須局部或完整剖析輸入,方可驗證它是否有效。

範例 1:使用 DTW_POS() 字串函數來驗證 SQL 陳述式

%FUNCTION(DTW_SQL) query1() {  		
   select * from shopper where shlogid = '$(shlogid)'              
%}

shlogid 變數的值應該是購物者 ID。它的目的在於將 SELECT 陳述式傳回的橫列限制為含有購物者 ID 識別的購物者的資訊的橫列。不過, 如果傳遞字串 "smith' or shlogid<>'smith" 作為變數 shlogid 的值,則查詢將變成:

select * from shopper where shlogid = 'smith' or shlogid<>'smith'

這個使用者修改過的原始 SQL SELECT 陳述式將傳回整個購物者表格。

Net.Data 字串函數可用來驗證使用者不會以不適當方式修改 SQL 陳述式。 例如,下列邏輯可用來確保與 shlogid 變數有關聯的輸入值是由單一購物者 ID 構成的:

@DTW_POS(" ", $(shlogid), result)
%IF (result == "0")
  @query1()
%ELSE
       %{ perform some sort of error processing %}
%ENDIF

範例 2:使用 DTW_TRANSLATE()

假設您的應用程式需要驗證輸入變數 num_orders 提供的值是一個整數。其中一種方法就是建立一個轉換表 trans_table, 含有所有鍵盤字元,但數值字元 0-9 除外,並使用 DTW_TRANSLATE 及 DTW_POS 字串函數來驗證輸入:

@DTW_TRANSLATE(num_orders, "x", trans_table, "x", string_out) 
      
 @DTW_POS("x", string_out, result)
     %IF (result = "0")
%{ continue with normal processing %}
%ELSE
       %{ perform some sort of error processing %}
%ENDIF

請注意,使用者無法在 Web 瀏覽器中修改儲存程序內的 SQL 陳述式, 且使用者提供的輸入參數會受到與輸入參數有關聯的 SQL 資料類型的限制。 在使用 Net.Data 字串函數來驗證使用者輸入值不是很實際的情況中,您可以使用儲存程序。

確認無法以更改應用程式行為的方式來修改 INCLUDE 陳述式中的檔名。
如果您使用 Net.Data 變數,透過 INCLUDE 陳述式指定檔名的值, 則將不會決定要併入的檔案,直到執行 INCLUDE 檔為止。 如果您打算在巨集內設定這個變數的值,但不容許瀏覽器的使用者置換巨集提供的值, 則您應該使用 DTW_ASSIGN 而非使用 DEFINE 來設定變數值。如果您打算允許瀏覽器的使用者提供檔名,則您的巨集應該驗證提供的值。

範例:查詢字串指定 (如 filename="../../x") 可能會造成併入的檔案是來自不是在 INCLUDE_PATH 架構陳述式中指定的目錄。 假設您的 Net.Data 起始設定檔含有下列路徑架構陳述式:

INCLUDE_PATH /usr/lpp/netdata/include

且您的 Net.Data 巨集含有下列 INCLUDE 陳述式:

%INCLUDE "$(filename)"

filename="../../x" 的查詢字串指定將併入檔案 /usr/lpp/x, 這不是 INCLUDE_PATH 架構陳述式規格想要的檔案。

Net.Data 字串函數可用來驗證提供的檔名是否適合應用程式。例如,下列邏輯可用來確保 與檔名變數有關聯的輸入值沒有字串 "..":

@DTW_POS("..", $(filename), result)
%IF (result > "0")
       %{ perform some sort of error processing %}
%ELSE
%{ continue with normal processing %}
%ENDIF 

設計您的資料庫及查詢,以便使用者要求無權存取其它使用者的敏感資料。
有些資料庫設計會將敏感資料收集在單一表格中。除非 SQL SELECT 要求會以某種形式來加以限定,否則這種方法可能會使得 Web 瀏覽器的使用者取得所有敏感資料。

範例:下列 SQL 陳述式將傳回變數 order_rn 所識別的訂單的訂單資訊:

select setsstatcode, setsfailtype, mestname
	from   merchant, setstatus
	where  merfnbr   = setsmenbr
	and    setsornbr = $(order_rn)

這種方法將容許瀏覽器中的使用者指定隨機訂單號碼,且可能取得其它客戶訂單的敏感資料。 保護這種外洩的方法就是製作下列變更:

例如,如果 shlogid 是含有與訂單有關聯的客戶 ID 的直欄, 且 SESSION_ID 是含有瀏覽器的使用者的鑑定 ID 的 Net.Data 變數,則您可以用下列陳述式置換先前的 SELECT 陳述式:

select setsstatcode, setsfailtype, mestname
  from   merchant, setstatus
  where  merfnbr   = setsmenbr
  and    setsornbr = $(order_rn)
  and    shlogid   = $(SESSION_ID)

使用 Net.Data 隱藏變數
您可以使用 Net.Data 隱藏變數來隱藏 Net.Data 巨集的不同性質, 讓使用者無法用他們的 Web 瀏覽器來顯示您的 HTML 原始檔案。 例如, 您可以隱藏您資料庫的內部結構。 請參閱隱藏變數,以取得隱藏變數的詳細資訊。

自使用者要求驗證資訊
您可以依據使用者提供的輸入來建立自己的保護方案。 例如,您可以透過 HTML 套表向使用者要求驗證資訊, 並使用您的 Net.Data 巨集從資料庫取回的資料, 或者從 Net.Data 巨集中定義的函數呼叫外部程式,來驗證它。

至於保護資產的詳細資訊, 請參閱常見問題 (FAQ) 中有關網際網路安全列示的部份,其 Web 網址如下:

http://www.w3.org/Security/Faq


[ 頁面頂端 | 前一頁 | 下一頁 | 目錄 | 索引 ]