审计在我们使用evaluate时出现了一个漏洞,因为它允许任意代码执行。有人有替代方案吗?以下示例。我们正在运行CF9。
<cfquery name="getvalue" datasource="#application.ds#">
SELECT #url.column#
FROM dbo.tbl#url.table#
WHERE (int#url.table#Id = <CFQUERYPARAM Value="#url.Id#">)
</cfquery>
<cfif url.rowtype eq "text">
<cfoutput>
<input type="text" id="focus#url.table##url.column##url.Id#"
name="#url.table##url.column##url.Id#"
value="#evaluate('getvalue.#url.column#')#"
class="inputtext"
onblur="updateeditvalue('#url.rowtype#','#url.table#','#url.column#',#url.Id#
,escape(this.form.#url.table##url.column##url.Id#.value))"
style="height:20px;width:500px;">
</cfoutput>
<cfelseif url.rowtype eq "textarea">
<cfoutput>
<textarea id="focus#url.table##url.column##url.Id#"
name="#url.table##url.column##url.Id#"
class="inputtext" style="height:20px;width:500px;"
onblur="updateeditvalue('#url.rowtype#','#url.table#','#url.column#',#url.Id#
, escape(this.form.#url.table##url.column##url.Id#.value))">
#evaluate('getvalue.#url.column#')#
</textarea>
</cfoutput>
</cfif>
答案 0 :(得分:1)
您需要使用getvalue[url.column][1]
,因此您需要提取getvalue
查询的第1行,否则您将收到错误消息。 Peter对SQL注入问题也是正确的。您至少需要使用<cfqueryparam>
进行查询
答案 1 :(得分:1)
您不应该直接在URL中包含column / table / id列名,这样就会打开SQL for injection。我看到你使用cfqueryparam
作为值,但是查询的其余部分使这个多余。
您应该通过URL传递别名,然后设置正确的列名。下面是一个非常简单的例子:
<cfset idColumn = ""/>
<cfset columnName = ""/>
<cfset tableName = ""/>
<cfif structKeyExists(url, "aliasForColumnA")>
<cfset columnName = "the_real_column_name_a"/>
<cfset tableName = "the_real_table_name_a"/>
<cfset idColumn = "int" & #tableName# & "Id"/>
<cfelseif structKeyExists(url, "aliasForColumnB")>
<cfset columnName = "the_real_column_name_b"/>
<cfset tableName = "the_real_table_name_b"/>
<cfset idColumn = "int" & #tableName# & "Id"/>
</cfif>
<cfquery name="getvalue" datasource="#application.ds#">
SELECT
#columnName#
FROM
#tableName#
WHERE
#idColumn# = <CFQUERYPARAM cfsqltype="CF_SQL_INTEGER" Value="#url.Id#"/>
</cfquery>
答案 2 :(得分:1)
如果你真的必须运行那个动态的SQL,这就是我要做的。 onApplicationStart使用cfdbinfo查询数据库元数据,获取数据库中的表列表,并将它们存储在应用程序范围内。
您可以编写一个获取URL.table并检查它是否存在于列表中的函数。如果没有列出,它可能会抛出错误。
同样的方法适用于列。这将检查您的表/列是否存在,但如果您只想允许访问某些表/列,则您无法选择存储某些列表或一组别名,如AlexP和Peter建议的那样。