Сессия загрузки Coldfusion из Id - PullRequest
       0

Сессия загрузки Coldfusion из Id

2 голосов
/ 18 февраля 2012

Есть ли способ загрузить конкретную пользовательскую сессию, указав правильное значение CFTOKEN и / или CFID?

Что-то вроде функции session_id ($ id) в php.

Или каким-либо образом изменить данные определенного сеанса.

Мне нужен веб-сервис, который будет добавлять или изменять некоторую информацию о конкретном сеансе пользователя. Я знаю значения CFID и CFTOKEN, потому что я использую поддомен cookie. Однако приложения находятся на разных серверах

Ответы [ 3 ]

2 голосов
/ 18 февраля 2012

Вы можете сделать это, передав правильные значения в URL, более подробная информация доступна здесь

http://ruthsarian.wordpress.com/2005/10/03/cf-session-hijacking/

ColdFusion использует два уникальных значения для отслеживания информации о сеансе пользователя,Эти значения являются CFID и CFTOKEN.Они хранятся в виде файлов cookie, но также могут передаваться по URL-адресу и внутри данных POST.

Переменные сеанса - это место для хранения информации, специфичной для пользователя и для текущего сеанса (например, является ли пользовательвошел в систему).

Можно перехватить сеанс пользователя, указав правильные значения CFID и CFTOKEN на сервере, либо по URL-адресу, либо в любом другом месте.

То, что вы пытаетесь сделать, эффективно описывается в этом посте http://old.nabble.com/ColdFusion-9-Session-Replication-td32621620.html, в котором содержится рекомендация против репликации сеансов по причине высокой загруженности сети из-за этого.

Где вы пытаетесь поддерживать определенныйобъем сеансов на нескольких физических серверах.В прошлом я работал над этим, чтобы поддерживать базу данных, хранящую информацию, которая должна передаваться между физическими серверами, привязанными к UUID.Для этого вы можете просто использовать значения CFID / CFTOKEN в качестве PK вашей базы данных, или вы можете сделать еще один PK в целом.Затем это позволит вам передать CFID и т. Д. В строке URL, а затем, если он попадет на сервер, который до сих пор не попал (т. Е. Сессия / сеанс не были загружены с использованием этих CFID / CFTOKEN), вы можете загрузитьпеременные, которые вам нужны из базы данных.

Редактировать альтернативный метод, не связанный с базой данных

Сначала настройте скрипт на одном сервере, т.е. getSessionData.cfm, который возвращает данные вобласть сеанса в переносимом формате, т.е. с помощью SaveObject () (если на CF9) или, возможно, SerializeJSON (), что-то в этом роде

<!--- on source server, getSessionData.cfm --->
<cfscript>
    WriteOutput(ToBase64(ObjectSave(session)));
</cfscript>

Затем настройте обработчик, который будет запрашивать данные с другого сервера, используяЗапрос cfhttp, заполняющий CFID / CFTOKEN для доступа к сеансу, а затем извлекает эти данные в сеанс на новом сервере.

<!--- on target server --->
<cfhttp url="http://sourceserver/getSessionData.cfm">
    <!--- Params to pass through CFID/CFTOKEN or any other cookie/url/post params etc --->
</cfhttp>
<cfscript>
    structToImportToSession = ObjectLoad(ToBinary(cfhttp.FileContent));
    for (thisStructKey in structToImportToSession) {
        session[thisStructKey] = structToImportToSession[thisStructKey];
    }   
</cfscript>

Проблема в том, что я чувствую себя неловко из-за того, что скрипт такого типа включенмой сервер в производственной среде.Это также означает, что вам нужно будет точно знать, с какого физического сервера пришел пользователь, чтобы вы могли запросить скрипт getSessionData.cfm с нужного сервера.

В этом посте Бена Наделя, похоже, используется аналогичный принцип для обновления данных сеанса, и его можно применить для его обновления, я ожидаю, http://www.bennadel.com/blog/725-Maintaining-Sessions-Across-Multiple-ColdFusion-CFHttp-Requests.htm

Лично я бы все же посоветовал базу данных.Метод Drive, так как он дает вам более четкую механику для очистки старых сессий и т. д., однако этот второй вариант должен быть жизнеспособным и дать вам доступ к тому, что вам нужно.

2 голосов
/ 05 марта 2012

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

<cfscript>
    appName = 'zadsApp';
    jSessTracker = CreateObject('java', 'coldfusion.runtime.SessionTracker');
    appSessions = jSessTracker.getSessionCollection(JavaCast('string', appName));
    targetSession = appSessions[appName & '_' & sessionCFID & '_' & sessionCFTOKEN];
    // Dumping, reading, writing WILL update the last accessed time.
    // There are ways around this if needed...
    WriteDump(targetSession);
    targetSession.something = 'A new value';
</cfscript>

Теперь вы упоминаете, что это на другом сервере, могу ли я просто дважды проверить, что вы хотите, чтобы отдельный сервер изменил сеанс на другом сервере?Без размещения какого-либо кода, подобного приведенному выше, на этом сервере (тот, что с сеансом)?Хотя было бы намного проще, если бы код был на том же сервере, вы могли бы выполнять код, подобный этому, удаленно, используя JMX ... но я уверен, что должен быть более простой способ сделать всеэто.

0 голосов
/ 18 февраля 2012

пока сеанс не истек, вы можете получить доступ к сеансу, используя CFID и CFTOKEN в URL

...