Простое приложение для защиты страниц Coldfusion - проблема с Session - PullRequest
1 голос
/ 07 февраля 2010

Я тестирую, как защитить страницы в Coldfusion, и столкнулся с проблемой при попытке создать процесс, с помощью которого пользователи могут выйти из системы.

По сути, у меня есть три страницы:

  1. Страница A - Форма для отправки Страница B
  2. Страница B - Это проверяет form.username и form.password против базы данных (работает нормально)
  3. Page C - страница выхода (где я нахожусь возникли проблемы).

Страница C выдает «переменная Session is undefined» ошибка

Вот код на странице C:

<cfset StructClear(Session)>
<cflocation url="index.cfm">

Вот код на странице B:

<cfif NOT IsDefined ("form.username")>
<cflocation url="index.cfm" addtoken="No">
</cfif>


<cfquery name="test" datasource="cfdb">
SELECT * FROM USERS
WHERE USERNAME = '#FORM.username#'
AND PASSWORD = '#FORM.password#'
</cfquery>


<!---<CFSET Session.LoggedIn = "1">
<CFSET Session.FirstName = "#test.FirstName#">--->

<CFIF test.RecordCount IS 0>
<cflocation url="index.cfm" addtoken="No">
<CFSET StructClear(Session)>
<cfelse>
<CFSET Session.LoggedIn = "1">
<!---<cflocation url="test.cfm" addtoken="No">--->
</cfif> 
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<p><a href="logout.cfm">Log Out</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br>
  This content is protected.
</p>
</body>
</html>

Как видите, ничего сложного:)

Теперь я подумал, что переменная Session может быть доступна для любой страницы в данном экземпляре браузера, но я, очевидно, ошибаюсь.

Что мне нужно сделать для страницы C (моя страница выхода должна иметь доступ к переменной сеанса).

Любое руководство приветствуется!

1 Ответ

3 голосов
/ 07 февраля 2010

Документы Adobe рекомендуют не использовать structclear для всего сеанса. Лучше было бы сделать так, чтобы подэлемент сеанса назывался чем-то вроде session.data, а затем structclear.Если вы действительно хотите, чтобы ваш код работал, попробуйте сохранить внутренние компоненты сеанса, а затем восстановить их следующим образом ...

<cflock timeout="15" throwontimeout="No" scope="SESSION" type="EXCLUSIVE">
   <cftry>
   <cfscript>
   variables.HoldCFID = session.CFID;
   variables.HoldCFT  = session.CFToken;
   variables.HoldSID  = session.SessionID;
   variables.HoldURLT = session.URLToken;
   structClear(session);
   session.CFID      = HoldCFID;
   session.CFToken   = HoldCFT;
   session.SessionID = HoldSID;
   session.URLToken  = HoldURLT;
   </cfscript>
  <cfcatch type="Any">
    <!--- {If the session strut was cleared without saving the vars first} --->
   <cfset rc = structClear(session)>
   Session Cleared in Catch<br>
  </cfcatch>
  </cftry>
</cflock>

Вот хорошая запись с некоторыми подробностями о том, как очистить сеанс structClear и Sessions- Все еще плохо? из блога Рэя Камдена.

Также в вашем примере показан классический вектор атаки для SQL-инъекций, убедитесь, что CFQueryParam содержит ваши FORM.username и FORM.pasword:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...