Сеансовые файлы cookie и Application.cfm

Этот код в Application.cfm (я знаю, что это, вероятно, должен быть .cfc, но это какой-то старый код, восходящий к MX) для файлов cookie, который отлично работал на CF8 и CF9, но я переместил его в локальный каталог с помощью CF10. Версия для разработчиков, и она не работала, пока я не закомментировал этот блок. Вот ошибка при достижении индекса.

The system has attempted to use an undefined value, which usually indicates a programming error, either in your code or some system code.

Null Pointers are another name for undefined values.

The error occurred in C:/ColdFusion10/cfusion/wwwroot/TFT/Application.cfm: line 3
1 : <!--- APPLICATION settings --->
2 : <cfif IsDefined("cfid")>
3 :     <cfcookie name="cfid" value="#cfid#" expires="NOW">
4 :     <cfcookie name="cftoken" value="#cftoken#" expires="NOW">
5 : </cfif>

Это текущий код в Application.cfm:

<!--- APPLICATION settings --->
<!--- 5/1/13 removed cookies temporarily
<cfif IsDefined("cfid")>
    <cfcookie name="cfid" value="#cfid#" expires="NOW">
    <cfcookie name="cftoken" value="#cftoken#" expires="NOW">
</cfif>--->

<!--- Define the application parameters--->
<cfapplication name="TFTAdmin" clientmanagement="Yes" 
    sessionmanagement="Yes" 
    setclientcookies="No" 
    sessiontimeout="#CreateTimeSpan('0','4','0','0')#" 
    applicationtimeout="#CreateTimeSpan('0','4','0','0')#">

<!--- Create cookies that disappear when the browser closes as to increase security --->
<cflock scope="session" type="readonly" timeout="5">
     <cfcookie name="cfid" value="#session.cfid#">
     <cfcookie name="cftoken" value="#session.cftoken#">
</cflock>

EDIT: в этом файле есть еще код, но он кажется неуместным.


person Macness    schedule 03.05.2013    source источник


Ответы (2)


Что произойдет, если вы правильно охватите свои переменные? cfid может быть определен в области переменных как значение null.

<cfif structKeyExists(session,"cfid")>
    <cfcookie name="cfid" value="#session.cfid#" expires="NOW">
    <cfcookie name="cftoken" value="#session.cftoken#" expires="NOW">
</cfif>
person Matt Busche    schedule 03.05.2013
comment
Спасибо. Мне пришлось разместить после объявления приложения (что имеет смысл), иначе session не определено. - person Macness; 03.05.2013
comment
@Macness ответ выше неверен. session не является частью порядка оценки объема . Таким образом, исходное условное и предложенное выше не одно и то же. Таким образом, код может не ошибаться, но он не выполняет свою работу по назначению. Смотрите мой ответ о том, что я думаю, происходит. - person nosilleg; 07.05.2013
comment
@nosilleg не уверен, почему мой ответ неверен? Проблема в том, что isDefined() НЕ смотрел на переменную сеанса, поэтому фактический порядок оценки области доказывает мою точку зрения. - person Matt Busche; 08.05.2013
comment
@MattBusche Исходный код никогда бы не смотрел на область сеанса, а ваше решение смотрит только на область сеанса. Хотя ваше решение работает, оно выполняет нечто отличное от того, что должен был делать код. - person nosilleg; 08.05.2013
comment
@MattBusche Чтобы уточнить, он сказал, что код раньше работал, а затем перестал работать на новом сервере. Таким образом, изменение поведения кода не устраняет проблему с новым сервером. Вот почему я говорю, что это не правильное решение. - person nosilleg; 08.05.2013

Поскольку вы были на новом сервере, я подозреваю, что вам удалось привести свои файлы cookie в состояние, в котором значения не имели смысла.

Я не уверен, что исправление кода в любом случае важно, потому что, похоже, оно делает что-то бессмысленное. Но быстрое исправление кода будет заключаться в следующем:

<cfif IsDefined("cfid")>
    <cfcookie name="cfid" value="" expires="NOW">
    <cfcookie name="cftoken" value="" expires="NOW">
</cfif>

Он по-прежнему проверяет только cfid, но не устанавливает значения файлов cookie. Значения не имеют значения, потому что срок действия файлов cookie истекает.

Причина, по которой я назвал этот код бессмысленным, заключается в том, что область Cookie является частью порядок оценки объема. Итак, код в целом говорит: «Если файлы cookie существуют, удалите их, а затем установите новые файлы cookie с новыми значениями». Таким образом, пользователи будут получать новую сессию при каждом обновлении страницы. Это то же самое, что и отсутствие управления сессиями. Таким образом, вы также можете установить sessionmanagement="false" и удалить оба блока кода cookie.

Возможно, хотя маловероятно, что этот код появился потому, что кто-то хотел обеспечить дополнительную безопасность, запретив изменение сеанса с помощью переменных URL/формы, тем самым ограничив захват сеанса. Однако то, как это было реализовано, также не решает эту проблему.

person nosilleg    schedule 07.05.2013