抵禦來自 SQL 插入式攻擊的 Dreamweaver ColdFusion 伺服器行為。
SQL 插入式攻擊的安全性風險
某些資料庫可讓您在單一查詢中傳送多個 SQL 陳述式。因此,當您將參數以查詢字串傳遞至動態產生的資料庫查詢時,便可能產生安全性風險。駭客會嘗試將惡意 SQL 陳述式附加到現有的參數,藉此修改動態查詢中的 URL 或表單變數。這通常稱為 SQL 插入式攻擊。部分由 Dreamweaver 建立的伺服器行為程式碼應經過修改以降低 SQL 插入式攻擊的風險。如需 SQL 插入的相關詳細背景資訊,請參閱維基百科文章。
注意: 此文章所描述的問題在 Dreamweaver 8.0.2 Updater 中已修正。
解決方法: 更新伺服器行為
當您讓查詢字串傳遞參數時,請確定只傳遞預期的資訊。Adobe 建立了Dreamweaver 8.0.2 Updater,此更新程式可降低 SQL 插入式攻擊的風險。這些修正已整合至所有後續發行的 Dreamweaver 版本。更新 Dreamweaver 8 之後,您必須將伺服器行為重新套用到使用這些行為的頁面,然後將這些頁面重新部署到您的伺服器。
此文件的其餘部分說明如何手動編輯 Dreamweaver MX 2004 程式碼,以防止 ColdFusion 伺服器機型的 SQL 插入式攻擊。下方列出了易受這類攻擊的伺服器行為與修正方法:
含篩選器的資料錄集
未經篩選的資料錄集無須經過修改,但經過篩選的資料錄集則需要。在下方範例中,命名為「Recordset1」的 Dreamweaver MX 2004 資料錄集是由透過 URL 參數傳入的 ID 值篩選。下方反白顯示的程式碼即為需要變更的部分:
<cfquery name="Recordset1" datasource="cafetownsend"> SELECT * FROM COMMENTS WHERE COMMENT_ID =#URL.COMMENT_ID#</cfquery>
若要保護資料錄集免於 SQL 插入式攻擊,請在包含 SQL SELECT 陳述式的 cfquery 標記中使用 cfqueryparam 標記。此 cfqueryparam 標記將會驗證查詢參數的資料類型,並協助保護資料庫免於未經授權的使用者存取。黄色一行為經過修改的安全程式碼:
<cfquery name="Recordset1" datasource="cafetownsend"> SELECT * FROM COMMENTS WHERE COMMENT_ID =<cfqueryparam value="#URL.COMMENT_ID#" cfsqltype="cf_sql_numeric"></cfquery>
「插入記錄」伺服器行為和「記錄插入表單精靈」
若要保護資料錄集免於 SQL 插入式攻擊,請在包含 SQL INSERT 陳述式的 cfquery 標記中使用 cfqueryparam 標記。此 cfqueryparam 標記將會驗證查詢參數的資料類型,並協助保護資料庫免於未經授權的使用者存取。
原始程式碼。下方反白顯示的程式碼即為需要變更的部分:
<cfquery datasource="cafetownsend"> INSERT INTO COMMENTS (FIRST_NAME, LAST_NAME, TELEPHONE) VALUES (<cfif IsDefined("FORM.textfield1") AND #FORM.textfield1# NEQ "">'#FORM.textfield1#'<cfelse>NULL</cfif> ,<cfif IsDefined("FORM.textfield2") AND #FORM.textfield2# NEQ "">'#FORM.textfield2#'<cfelse>NULL</cfif> ,<cfif IsDefined("FORM.textfield3") AND #FORM.textfield3# NEQ "">'#FORM.textfield3#'<cfelse>NULL</cfif> )</cfquery>
修改後的安全程式碼:
<cfquery datasource="cafetownsend"> INSERT INTO COMMENTS (FIRST_NAME, LAST_NAME, TELEPHONE) VALUES<cfif IsDefined("FORM.textfield1") AND #FORM.textfield1# NEQ ""><cfqueryparam value="#FORM.textfield1#" cfsqltype="cf_sql_clob" maxlength="50"><cfelse>''</cfif> ,<cfif IsDefined("FORM.textfield2") AND #FORM.textfield2# NEQ ""><cfqueryparam value="#FORM.textfield2#" cfsqltype="cf_sql_clob" maxlength="50"><cfelse>''</cfif> ,<cfif IsDefined("FORM.textfield3") AND #FORM.textfield3# NEQ ""><cfqueryparam value="#FORM.textfield3#" cfsqltype="cf_sql_clob" maxlength="20"><cfelse>''</cfif> )</cfquery>
注意: 請為資料選擇適當的 cfslqtype 和 maxlength 值。
「更新記錄」和「記錄更新表單精靈」
「更新記錄」伺服器行為與「記錄更新表單精靈」需要結合上述的修正方法。首先,尋找包含 SQL SELECT 陳述式的 cfquery,並依照含篩選器的資料錄集中說明的方式修改其內容。接著,尋找包含 SQL UPDATE 陳述式的 cfquery,並依照「插入記錄」伺服器行為和「記錄插入表單精靈」中說明的方式修改其內容。
「刪除記錄」伺服器行為
「刪除記錄」伺服器行為修改方式與含篩選器的資料錄集的修改方式類似。
原始程式碼:
<cfquery datasource="cafetownsend"> DELETE FROM COMMENTS WHERE COMMENT_ID=#URL.COMMENT_ID#</cfquery>
修改後的安全程式碼:
<cfquery datasource="cafetownsend"> DELETE FROM COMMENTS WHERE COMMENT_ID=<cfqueryparam value="#URL.COMMENT_ID#" cfsqltype="cf_sql_numeric"></cfquery>
注意: 請為資料選擇適當的 cfslqtype 和 maxlength 值。
「登入使用者」伺服器行為
若要修正「登入使用者」伺服器行為程式碼,請尋找 cfquery 標記並新增 cfqueryparam 標記。
原始程式碼:
<cfquery name="MM_rsUser" datasource="cafetownsend"> SELECT FIRST_NAME,LAST_NAME FROM COMMENTS WHERE FIRST_NAME='#FORM.textfield1#' AND LAST_NAME='#FORM.textfield2#'</cfquery>
修改後的安全程式碼:
<cfquery name="MM_rsUser" datasource="cafetownsend"> SELECT FIRST_NAME,LAST_NAME FROM COMMENTS WHERE FIRST_NAME=<cfqueryparam value="#FORM.textfield1#" cfsqltype="cf_sql_clob" maxlength="50"> AND LAST_NAME=<cfqueryparam value="#FORM.textfield2#" cfsqltype="cf_sql_clob" maxlength="50"></cfquery>
注意: 請為資料選擇適當的 cfslqtype 和 maxlength 值。
「檢查新使用者」伺服器行為
「檢查新使用者」伺服器行為需要您先將「插入記錄」伺服器行為新增至頁面。首先,尋找包含 SQL SELECT 陳述式的 cfquery,並依照含篩選器的資料錄集中說明的方式修改其內容。接著,尋找包含 SQL INSERT 陳述式的 cfquery,並依照「插入記錄」伺服器行為和「記錄插入表單精靈」中說明的方式修改其內容。
「主要詳細資料頁面集」
其他資訊
Adobe 建議您使用每個 cfquery 標記中的 cfqueryparam 標記來協助保護資料庫免於未經授權的使用者存取。如需詳細資訊,請參閱:
- 利用 cfqueryparam 強化安全性
- Adobe 安全性佈告欄: APSB 06-07 Dreamweaver 伺服器行為 SQL 插入漏洞