2

이 코드는 Application.cfm에 있습니다. (아마도 .cfc 여야하지만, 이것은 MX로 거슬러 올라가는 오래된 코드입니다) CF8 및 CF9에서 제대로 작동하는 데 사용되는 쿠키 내가 CF10 개발자 에디션을 사용하여 로컬 디렉토리로 옮겼습니다. 그리고 그 블록을 주석 처리하기 전에는 작동하지 않았습니다. 색인에 도달하면 오류가 발생합니다.세션 쿠키 및 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> 

편집 :

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의에서 현재 코드는이 파일에 더 많은 코드가있다 -하지만 관련이없는 것 같다.

답변

1

변수를 올바르게 범위를 지정하면 어떻게됩니까? cfid는 변수 범위에 null 값으로 정의 될 수 있습니다.

<cfif structKeyExists(session,"cfid")> 
    <cfcookie name="cfid" value="#session.cfid#" expires="NOW"> 
    <cfcookie name="cftoken" value="#session.cftoken#" expires="NOW"> 
</cfif> 
+0

감사합니다. 응용 프로그램 선언 다음에 놓아야 만합니다. 그렇지 않으면'session'이 정의되지 않았습니다. – Macness

+0

@Macness 위의 답변이 잘못되었습니다. 'session'은 ColdFusion [범위 평가 순서] (http://help.adobe.com/ko_KR/ColdFusion/10.0/Developing/WSc3ff6d0ea77859461172e0811cbec09af4-7fdf.html)의 일부가 아닙니다. 따라서 원래의 조건부 조건과 위의 조건부 조건은 동일하지 않습니다. 따라서 코드는 오류가 아니지만 의도 한 작업을 수행하지는 못합니다. 내가 생각하는 바에 대한 내 대답을보십시오. – nosilleg

+0

@nosilleg 어떻게 내 대답이 잘못 되었습니까? 문제는'isDefined()'는 세션 변수를 보지 않았기 때문에 scope evaluation order actual이 내 포인트를 증명합니다. –

0

새 서버를 사용했기 때문에 쿠키가 의미있는 가치가없는 상태로 쿠키를 가져올 수 있다고 생각합니다.

어쨌든 코드를 수정하는 것이 확실하지 않은 이유는 무의미한 일을하고 있기 때문입니다. 그러나 코드의 빠른 수정이 작업을 수행하는 것입니다 : 그것은 여전히 ​​cfid을 테스트거야하지만 쿠키의 값을 설정하지 않는 것

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

. 코드가 쿠키를 만료하기 때문에 값은 중요하지 않습니다.

내가 코드가 무의미하다고 말한 이유는 범위가 scope evaluation order의 일부이기 때문입니다. 따라서 전체 코드가 "쿠키가 존재하면 쿠키를 제거한 다음 새 값으로 새 쿠키를 설정하는 것"이라고 말합니다. 따라서 사용자는 모든 페이지를 새로 고침 할 때마다 새로운 세션을 갖게됩니다. 그것은 처음에는 세션 관리가없는 것과 같습니다. 따라서 sessionmanagement="false"을 설정하고 쿠키 블록 두 개를 모두 제거 할 수 있습니다.

누군가가 URL/양식 변수를 통해 세션을 변경하지 못하게하여 약간의 보안을 추가하기를 원했기 때문에이 코드가 나왔을 가능성이 있습니다. 따라서 session hijacking으로 제한됩니다. 그러나 그것이 구현 된 방법은 그 문제를 해결하지 못합니다.