使用ColdFusion MX7,如果我们遇到异常,我们会向开发团队发送电子邮件,其中包含各种数据范围的转储,包括表单结构。
这对于调试非常有用,但在用户登录时出现错误的情况下除外。我们最终会打印出密码。
所以问题是,是否有一种方法可以修改CFDUMP文件,以使其从表单对象中过滤掉密码值?
当然,我们可以将其放入发送电子邮件的相同代码中,但最好将其放入CFDUMP文件中,这样我们就不必担心它会出现在其他地方。
我已经找到了CFDUMP文件,似乎它是二进制的,所以我猜我们无法做到。
使用ColdFusion MX7,如果我们遇到异常,我们会向开发团队发送电子邮件,其中包含各种数据范围的转储,包括表单结构。
这对于调试非常有用,但在用户登录时出现错误的情况下除外。我们最终会打印出密码。
所以问题是,是否有一种方法可以修改CFDUMP文件,以使其从表单对象中过滤掉密码值?
当然,我们可以将其放入发送电子邮件的相同代码中,但最好将其放入CFDUMP文件中,这样我们就不必担心它会出现在其他地方。
我已经找到了CFDUMP文件,似乎它是二进制的,所以我猜我们无法做到。
您可以将dump.cfm文件复制到dumporiginal.cfm,然后创建一个新的dump.cfm文件来调用dumporiginal.cfm。
<!---
So that it won't execute twice if you
have a closing slash (<cfdump ... />)
--->
<cfif thisTag.executionMode neq "start">
<cfexit method="exitTag" />
</cfif>
<!---
defaults for optional attributes, taken from the docs
http://livedocs.adobe.com/coldfusion/8/htmldocs/Tags_d-e_08.html
--->
<cfparam name="attributes.expand" default="yes" />
<cfparam name="attributes.format" default="html" />
<cfparam name="attributes.hide" default="all" />
<cfparam name="attributes.keys" default="9999" />
<cfparam name="attributes.label" default="" />
<cfparam name="attributes.metainfo" default="yes" />
<cfparam name="attributes.output" default="browser" />
<cfparam name="attributes.show" default="all" />
<cfparam name="attributes.showUDFs" default="yes" />
<cfparam name="attributes.top" default="9999" />
<!--- Hide the password, but store its value to put it back at the end --->
<cfif isStruct(attributes.var) and structKeyExists(attributes.var, 'password')>
<cfset originalPassword = attributes.var.password />
<cfset attributes.var.password = "{hidden by customized cfdump}"/>
</cfif>
<!---
Call the original cfdump.
Which attributes you pass depends on CF version.
--->
<cfswitch expression="#listFirst(server.coldfusion.productVersion)#">
<cfcase value="6">
<cfdumporiginal
var = "#attributes.var#"
expand = "#attributes.expand#"
hide = "#attributes.hide#"
label = "#attributes.label#"
>
</cfcase>
<cfcase value="7">
<cfdumporiginal
var = "#attributes.var#"
expand = "#attributes.expand#"
hide = "#attributes.hide#"
label = "#attributes.label#"
top = "#attributes.top#"
>
</cfcase>
<cfdefaultcase>
<cfdumporiginal
var = "#attributes.var#"
expand = "#attributes.expand#"
format = "#attributes.format#"
hide = "#attributes.hide#"
keys = "#attributes.keys#"
label = "#attributes.label#"
metainfo = "#attributes.metainfo#"
output = "#attributes.output#"
show = "#attributes.show#"
showUDFs = "#attributes.showUDFs#"
top = "#attributes.top#"
>
</cfdefaultcase>
</cfswitch>
<!--- Restore the password, in case it's read after cfdump call --->
<cfif isDefined("originalPassword")>
<cfset attributes.var.password = originalPassword />
</cfif>
不,我认为没有一种方法可以修改的行为。显然我不能确定。虽然这样的黑客存在是可以想象的,但并不一定值得推荐。
为什么不使用一个简单的:
<cftry>
<cfset DoSomethingThatFails()>
<cfcatch>
<cfif StructKeyExists(FORM, "Password")>
<cfset FORM.Password = "***">
</cfif>
<cfdump var="#FORM#">
</cfcatch>
</cftry>
CFDUMP 最初是在 CF5 时期作为自定义标签 (CF_DUMP) 出现的。您始终可以获取该自定义标签的代码并根据您的需求进行修改,然后使用它来替代内置标签。
只有密码的显示是个问题吗?如果是,也许解决方案是对密码进行盐值哈希?我认为这是一个好的实践。
http://blog.mxunit.org/2009/06/look-ma-no-password-secure-hashing-in.html