保护 Dreamweaver 的 ColdFusion 服务器行为免受 SQL 注入攻击。
SQL 注入攻击的安全风险
有些数据库允许您在一个查询中发送多个 SQL 语句。因此,当您将一个查询字符串中的参数传递到动态生成的数据库查询时,便会面临潜在的安全风险。黑客可能企图通过向现有参数中附加恶意 SQL 语句,从而修改动态查询中的 URL 或表单变量。这通常称为 SQL 注入攻击。应当修改 Dreamweaver 创建的某些服务器行为代码,以降低 SQL 注入攻击的风险。有关 SQL 注入的更多背景信息,请参阅这篇维基百科文章。
注意:本文中所述的问题已在 Dreamweaver 8.0.2 更新程序中得到修复。
解决方案:更新服务器行为
如果您让查询字符串传递参数,请确保仅传递预期的信息。Adobe 已创建 Dreamweaver 8.0.2 更新程序,可降低 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 标记,以帮助保护您的数据库免受未授权用户的侵害。有关详细信息,请参阅: