coldfusion更好地利用cfparam

时间:2012-10-08 09:19:58

标签: coldfusion query-string

在我们的索引文件中,在文件的顶部,我们通常会<cfparam>输出来自URL,表单或任何地方的变量。但是,我们正在通过 www.example.com/survey/index.cfm?nPageNumber=-1 之类的内容让很多机器人来打我们这意味着这样的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或者有更好的方法吗?

1 个答案:

答案 0 :(得分: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