【发布时间】:2016-11-09 11:36:46
【问题描述】:
这段代码正在生产中,用于根据使用情况阻止 IP。触发了一封电子邮件,并执行了一个插入,其 IP 地址满足 cfif 条件。但是,当我在 SQL 编辑器中执行查询时,对于相同的 IP,它返回的计数为 0(即 getNineHundredCnt.maxDownload)。
这仅发生在一位用户身上。它对其他用户来说运行良好,每天有近 1L 用户访问该应用程序。谁能帮忙解释一下为什么会这样?
<cfquery name="getExcessiveUsageConfig" DATASOURCE="#arguments.datasrc#">
SELECT * FROM ExcessiveUsageConfig
</cfquery>
<cfset usageLimitStruct.maxFifMinDownload = getExcessiveUsageConfig.MAXFIFMINDOWNLOAD >
<!---- This value is 900 and not changed --->
<cfquery name="getNineHundredCnt" DATASOURCE="#arguments.datasrc#">
SELECT
( select count(9)
from downloads
where download_time > dateadd(minute,-15,getdate())
and USER_IP = <cfqueryparam value="#remoteAddress#" cfsqltype="CF_SQL_VARCHAR">
) as maxDownload,
( select TOP 1 DATEDIFF(second, DOWNLOAD_TIME, GETDATE())
from CAPTCHA
WHERE USER_IP = <cfqueryparam value="#remoteAddress#" cfsqltype="CF_SQL_VARCHAR">
and Erights_sessionId = <cfqueryparam value="#arguments.erightsCookie#" cfsqltype="CF_SQL_VARCHAR">
order by DOWNLOAD_TIME DESC
) as Ccheck
</cfquery>
<cfif getNineHundredCnt.maxDownload gte usageLimitStruct.maxFifMinDownload>
<cfquery name="checkToBlockIpExcessUsage" DATASOURCE="#arguments.dataAuthentication#">
INSERT INTO DisabledIPs(IP,TIMEDISABLED)
VALUES (<cfqueryparam value="#remoteAddress#" cfsqltype="CF_SQL_VARCHAR">,GETDATE())
</cfquery>
<cfmail from="xxx@xxx.com" to="xxx@xxx.com" subject="IP Blocked" type="text">
IP : #remoteAddress#
Time : #currentTime#
The IP has been blacklisted
</cfmail>
</cfif>
【问题讨论】:
-
如果查询超时,是否有机会从 sql 查询中返回 0 作为值?
-
ExcessiveUsageConfig 中有多少行?
-
只有一行,MAXFIFMINDOWNLOAD列的值为900
-
将变量添加到电子邮件中,以便在再次发生时可以跟踪它们。 当我在 sql 编辑器中执行查询时 在同一时间段内?如果稍后执行,结果可能会有所不同。 (顺便说一句,这个问题被标记为三个引擎。具体来说,您使用的是哪一个?)
-
@nikhilreddy - 这段代码是否可能包含在 cffunction 中,而您忘记了
var/local范围内的所有变量?如果是这样,它可能会导致竞争条件和您描述的场景。解决办法是var/local作用域all的函数局部变量,包括查询名称。
标签: coldfusion railo lucee