抵禦來自 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>

注意: 請為資料選擇適當的 cfslqtypemaxlength 值。

「更新記錄」和「記錄更新表單精靈」

「更新記錄」伺服器行為與「記錄更新表單精靈」需要結合上述的修正方法。首先,尋找包含 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>

注意: 請為資料選擇適當的 cfslqtypemaxlength 值。

「登入使用者」伺服器行為

若要修正「登入使用者」伺服器行為程式碼,請尋找 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>

注意: 請為資料選擇適當的 cfslqtypemaxlength 值。

「檢查新使用者」伺服器行為

「檢查新使用者」伺服器行為需要您先將「插入記錄」伺服器行為新增至頁面。首先,尋找包含 SQL SELECT 陳述式的 cfquery,並依照含篩選器的資料錄集中說明的方式修改其內容。接著,尋找包含 SQL INSERT 陳述式的 cfquery,並依照「插入記錄」伺服器行為和「記錄插入表單精靈」中說明的方式修改其內容。

「主要詳細資料頁面集」

對於「主要詳細資料頁面集」應用程式物件,其主要變更在於 Dreamweaver 針對「詳細資料頁面」所建立的資料錄集。如果您的「主要頁面」中沒有經過篩選的資料錄集,則無須針對「主要頁面」做任何變更。如果您的「主要頁面」中有經過篩選的資料錄集,請參閱含篩選器的資料錄集以更新資料錄集程式碼。

針對「詳細資料頁面」,請尋找包含 SQL SELECT 陳述式的 cfquery,並依照含篩選器的資料錄集中說明的方式修改其內容。

其他資訊

Adobe 建議您使用每個 cfquery 標記中的 cfqueryparam 標記來協助保護資料庫免於未經授權的使用者存取。如需詳細資訊,請參閱:

此産品由 Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License 授權  Creative Commons 條款未涵蓋 Twitter™ 與 Facebook 文章。

法律說明   |   線上隱私權政策