Coldfusion 更好地利用 cfparam

标签 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 吗?正确还是有更好的方法来做到这一点?

最佳答案

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

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 .

关于Coldfusion 更好地利用 cfparam,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12778712/

相关文章:

javascript - 使用 JavaScript 正则表达式解析查询字符串

javascript - 如何在 AngularJS 中将查询字符串附加到 url 中?

mysql - Coldfusion 数据库存储行为不稳定

css - 文本区域在电子邮件冷融合中丢失样式

coldfusion - 合并单元格的 CFSpreadsheet 边框

django - 从内联 css 中删除查询字符串

http - 用于标识资源的查询字符串

mysql - 如何将对象(从 MySQL 临时表)返回到 Coldfusion 存储过程中?

web-services - Coldfusion Web 服务无法上传文件

php - 通过查询字符串 php 选择表过滤器