2012-10-08 28 views
3

在我们的索引文件中,在文件的顶部,我们通常会将<cfparam>列出来自URL,窗体或任何地方的变量。然而,我们得到了很多机器人打我们的东西像www.example.com/survey/index.cfm?nPageNumber=-1意味着这样的cfparam的:coldfusion更好地使用cfparam

<cfparam name="request.parameters.nPageNumber" default="1" type="numeric" /> 

将失败归因于废话一个机器人正在进入查询字符串。

我发现自己越来越有写我cfparams这样的:

<cfif structKeyExists(request.parameters,"nPageNumber") AND isNumeric(request.parameters.nPageNumber)> 
    <cfparam name="request.parameters.nPageNumber" default="1" type="numeric" /> 
<cfelse> 
    <cfset request.parameters.nPageNumber = 1> 
</cfif> 

虽然这解决了这个问题,我不禁觉得这个解决方案是不是最好/最有效的。我正确使用cfparam还是有更好的方法来做到这一点?

回答

5

确保存在变量并验证其值是两个独立的任务。

URLForm你的存在代码的情况下应该是这样的:

<cfparam name="URL.nPageNumber" default="1" type="string"> 

使用的type存在只是为了确保没有真正离奇的发生,如值是一个结构或查询等等,因为你想要一个优雅的错误而不是500的用户,所以你现在不想具体说明。

确定该值存在后,您需要验证该值。

<cfif isNumeric(URL.nPageNumber) EQ false OR URL.nPageNumber LT 1 OR URL.nPageNumber GT Variables.MaxPages> 
    <cfset ArrayAppend(Variables.ErrorArray, "Incorrect page number requested.")> 
</cfif> 

你可能会迫使价值的东西神志清醒,但看到Martian Headsets了相反的观点到robustness principle

提供错误信息而不是“显示健全的东西”会告诉用户他们做错了什么,并且意味着如果您还没有(尽管您应该),您不会被迫使用canonical urls

是的,这是更多的工作。您可以为其设计一些抽象概念,但在原始级别,这就是您应该对cfparam和验证所做的事情。

在您不需要友善回应的情况下,例如机器人或显然是黑客或探测的请求时,还可以选择提供“400”响应代码。 w3c将响应定义为“请求语法不好或本质上不可能满足”。 here和“由于格式错误,服务器无法理解请求,客户端不应该在没有修改的情况下重复请求。” here