ColdFusion 消毒 SQL
ColdFusion Sanatize SQL
我正在尝试遍历 tableList 和 运行 查询每个 table 从每个列表中获取计数。并非所有代码都包含在内,但问题在于 cfqueryparam。当我现在 运行 这段代码时,错误显示 "INVALID TABLE NAME"。这是我现在正在尝试的:
<cfloop list="#tableList#" index="t">
<cfquery name="getcount" datasource="erisnetselect">
SELECT COUNT(*) FROM <cfqueryparam value='AUDITOR.#t#' sqltype="VARCHAR">
</cfquery>
问题具体出在这一行:
SELECT COUNT(*) FROM <cfqueryparam value='AUDITOR.#t#' sqltype="VARCHAR">
我也试过:
SELECT COUNT(*) FROM AUDITOR.<cfqueryparam value='#t#' sqltype="VARCHAR">
但是我得到了同样的错误。
我认为可能有一种方法可以在这些 table 名称进入查询之前对其进行清理,但我不确定该怎么做。如果您需要所有代码,我可以提供更多,但这是一个巨大的页面。
cfqueryparam
是预准备语句的值占位符。您不能对 table 或列名使用值占位符,因为准备好的语句要求在输入任何值之前查询是完整且有效的。准备好的语句的设计目标之一是通过将查询和查询分开来防止恶意注入值。分离是通过首先发送没有实际值的查询来实现的(值占位符通常用问号 ?
表示),让 SQL 服务器解析并理解它(查询解释器),然后等待数据放入准备好的值槽中。这也带来了性能优势,因为 SQL 服务器可以重用已经解释的查询,而发送带有查询和值的纯字符串语句总是需要再次解析它。
要解决您的问题,您必须使用适当的命令 builder/quoter 清理 table 名称(取决于 SQL 供应商,检查您的 JDBC 驱动程序)或手动验证名称。
如果您必须使用手动方式,您应该保守一点,只允许万无一失的字符,例如字母、数字、下划线和连字符。考虑一下:
<cfloop list="#tableList#" index="t">
<!--- make sure the table name only consists of alphabetic letters, digits, underscores and hyphens --->
<cfif not reFind("^[a-zA-Z0-9_-]+$", t)>
<cfthrow message='The specified table name, which is "#t#", contains illegal characters.'>
</cfif>
<cfquery name="getcount" datasource="erisnetselect">
SELECT COUNT(*) FROM AUDITOR.#t#
</cfquery>
...
我正在尝试遍历 tableList 和 运行 查询每个 table 从每个列表中获取计数。并非所有代码都包含在内,但问题在于 cfqueryparam。当我现在 运行 这段代码时,错误显示 "INVALID TABLE NAME"。这是我现在正在尝试的:
<cfloop list="#tableList#" index="t">
<cfquery name="getcount" datasource="erisnetselect">
SELECT COUNT(*) FROM <cfqueryparam value='AUDITOR.#t#' sqltype="VARCHAR">
</cfquery>
问题具体出在这一行:
SELECT COUNT(*) FROM <cfqueryparam value='AUDITOR.#t#' sqltype="VARCHAR">
我也试过:
SELECT COUNT(*) FROM AUDITOR.<cfqueryparam value='#t#' sqltype="VARCHAR">
但是我得到了同样的错误。
我认为可能有一种方法可以在这些 table 名称进入查询之前对其进行清理,但我不确定该怎么做。如果您需要所有代码,我可以提供更多,但这是一个巨大的页面。
cfqueryparam
是预准备语句的值占位符。您不能对 table 或列名使用值占位符,因为准备好的语句要求在输入任何值之前查询是完整且有效的。准备好的语句的设计目标之一是通过将查询和查询分开来防止恶意注入值。分离是通过首先发送没有实际值的查询来实现的(值占位符通常用问号 ?
表示),让 SQL 服务器解析并理解它(查询解释器),然后等待数据放入准备好的值槽中。这也带来了性能优势,因为 SQL 服务器可以重用已经解释的查询,而发送带有查询和值的纯字符串语句总是需要再次解析它。
要解决您的问题,您必须使用适当的命令 builder/quoter 清理 table 名称(取决于 SQL 供应商,检查您的 JDBC 驱动程序)或手动验证名称。
如果您必须使用手动方式,您应该保守一点,只允许万无一失的字符,例如字母、数字、下划线和连字符。考虑一下:
<cfloop list="#tableList#" index="t">
<!--- make sure the table name only consists of alphabetic letters, digits, underscores and hyphens --->
<cfif not reFind("^[a-zA-Z0-9_-]+$", t)>
<cfthrow message='The specified table name, which is "#t#", contains illegal characters.'>
</cfif>
<cfquery name="getcount" datasource="erisnetselect">
SELECT COUNT(*) FROM AUDITOR.#t#
</cfquery>
...