3

在我们的索引文件中,在文件的顶部,我们通常会<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正确还是有更好的方法来做到这一点?

4

1 回答 1

5

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

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

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

使用typethere 只是为了确保没有发生任何真正奇怪的事情,例如值是结构或查询等。此时您不想具体说明,因为您想要一个优雅的错误而不是用户的 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以获得稳健性原则的反驳论点。

提供错误消息而不是“显示一些正常的东西”会通知您的用户他们做错了什么,这意味着如果您还没有使用规范 url(尽管您应该这样做) ,您不必被迫使用规范的 url 。

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

在您不需要友好响应的情况下,例如机器人或显然是黑客或探测的请求,还有提供“400”响应代码的附加选项。w3c 将响应定义为“请求语法错误或天生无法满足”。这里和“由于语法错误,服务器无法理解请求。客户端不应该在不修改的情况下重复请求。” 在这里

于 2012-10-08T10:15:45.980 回答