Неожиданные результаты сравнения CFQUERY и CFIF

Этот фрагмент кода находится в производстве для блокировки IP-адресов в зависимости от использования. Электронная почта была инициирована, и выполнена вставка с IP-адресом, удовлетворяющим условию cfif. Однако, когда я выполнил запрос в редакторе SQL для того же IP, он вернул счетчик как 0 (т.е. getNineHundredCnt.maxDownload).

Это произошло только для одного пользователя. Он отлично работает для остальных пользователей, почти 1 л пользователей ежедневно обращаются к приложению. Может ли кто-нибудь помочь объяснить, почему это произошло?

<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="[email protected]" to="[email protected]" subject="IP Blocked"  type="text">
     IP : #remoteAddress#
     Time : #currentTime#
     The IP has been blacklisted 
     </cfmail>

</cfif>

person nikhil reddy    schedule 09.11.2016    source источник
comment
есть ли шанс вернуть 0 в качестве значений из запроса sql, если время ожидания запроса истекло?   -  person nikhil reddy    schedule 09.11.2016
comment
Сколько строк в ExcessiveUsageConfig?   -  person Dan Bracuk    schedule 09.11.2016
comment
это только одна строка, а значение столбца MAXFIFMINDOWNLOAD равно 900   -  person nikhil reddy    schedule 09.11.2016
comment
Добавьте переменные в электронное письмо, чтобы вы могли отслеживать их, если это произойдет снова. когда я выполнил запрос в редакторе sql За тот же период времени? Результаты могут быть другими, если выполнить позже. (Кстати, вопрос отмечен тремя движками. В частности, какой из них вы используете?)   -  person Leigh    schedule 09.11.2016
comment
Что происходит, когда вы запускаете запрос getNineHundredCnt с помощью ColdFusion вне этой функции?   -  person Dan Bracuk    schedule 09.11.2016
comment
@Leigh это coldfusion 8 и MS sql 2008 R2, и вообще нет записей для ip в таблице загрузок, так что не беспокойтесь о времени.   -  person nikhil reddy    schedule 10.11.2016
comment
@DanBracuk maxDownload: 0, Ccheck: Null   -  person nikhil reddy    schedule 10.11.2016
comment
еще одна вещь, которую я заметил, заключается в том, что временной разрыв в 30 минут между временем в столбце Cfmail (Time: #currentTime#) и TIMEDISABLED в таблице DisabledIPs. оба произошли по одному и тому же запросу   -  person nikhil reddy    schedule 10.11.2016
comment
То же самое произошло сегодня, и я провел некоторый анализ Fusion Reactor, как только получил электронное письмо. Причина в том, что IP-адрес в запросе отличается, а IP-адрес в электронной почте и DisabledIPs отличается. В чем может быть причина?   -  person nikhil reddy    schedule 10.11.2016
comment
@nikhilreddy - Возможно ли, что этот код содержится в cf-функции, и вы забыли var/local область видимости всех переменных? Если это так, это может привести к условиям гонки и сценарию, который вы описали. Решение состоит в том, чтобы var/local охватить все локальные переменные функции, включая имена запросов.   -  person Leigh    schedule 10.11.2016
comment
да @Leigh, я не использую область внутри функции. Кроме того, я использую GetHttpRequestData().headers[X-Forwarded-For]) для IP-адреса клиента вместо переменных CGI. Приведет ли это к гонке?   -  person nikhil reddy    schedule 11.11.2016
comment
@nikhilreddy - Если к функции / cfc обращаются несколько потоков, то да, она может столкнуться с условиями гонки. Вам необходимо локализовать все локальные переменные функции, включая имена запросов.   -  person Leigh    schedule 11.11.2016


Ответы (1)


Одна из возможностей состоит в том, что getNineHundredCnt.maxDownload равно 0, а использованиеLimitStruct.maxFifMinDownload также равно 0. Выведите значения и проверьте.

person BKBK    schedule 09.11.2016