2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Что лежит в куке
Сообщение22.07.2018, 12:28 


16/07/18

30
Любопытства ради, залез в каталог, куда мой браузер(IE) пишет куки, открыл первый попавшийся файл и начал читать. Перед моим взором открылся построчный перечень данных. Захотелось разобраться.
Насколько я понял, в файле лежат куки с определенного сайта. Каждому куку отводится 8 строчек файла. Если куков с сайта несколько, то они разделены знаком звездочка .
Условно обозначаю строки как $a_1,a_2,a_3,a_4,a_5,a_6,a_7,a_8 $. Захотелось узнать, какая информация лежит в каждой строке.
Предположил, что
$a_1$- название кука, данное программистом
$a_2$- значение кука, которое по некоторым соображениям было записано на мой компьютер
$a_3$- название сайта, который данный кук выставил
Назначение остальных 5-ти строк $a_4,a_5,a_6,a_7,a_8$ не знаю. Где-то тут должна быть информация по времени существования кука, которую прочитать не смог.
Какое назначение строк $a_4,a_5,a_6,a_7,a_8$ каждого кука?

 Профиль  
                  
 
 Posted automatically
Сообщение22.07.2018, 12:36 
Заслуженный участник


09/05/12
25179
 i  Тема перемещена из форума «Computer Science» в форум «Компьютерные сети и Web-технологии»
Причина переноса: тематика.

Хотя, конечно, было бы неплохо пояснить, почему для получения ответа не удалось воспользоваться любым поисковиком.

 Профиль  
                  
 
 Re: Что лежит в куке
Сообщение22.07.2018, 16:22 
Заслуженный участник


20/08/14
11760
Россия, Москва
$a_4$ какие-то битовые флаги.
$a_6$ похоже на срок действия.
$a_8$ похоже на дату создания.
$a_5$ и $a_7$ могут быть дробными частями следующих дат. Во всяком случае явной закономерности в этих двух не вижу. Скорее даже $a_{5..8}$ являются двумя 64-битными числами двух дат (окончания срока и создания), хранимыми каждое в виде двух 32-битных беззнаковых чисел начиная с младшего.

 Профиль  
                  
 
 Re: Что лежит в куке
Сообщение23.07.2018, 10:25 


10/03/16
4444
Aeroport
toser

Я думаю что по настоящему интересные куки сильно обфусцированы.

 Профиль  
                  
 
 Re: Что лежит в куке
Сообщение23.07.2018, 10:46 
Заслуженный участник


16/02/13
4194
Владивосток
ozheredov в сообщении #1328309 писал(а):
по-настоящему интересные куки
Полагаете, в них хранится информация, где владелец сервера зарыл свой клад? Сомневаюсь.

 Профиль  
                  
 
 Re: Что лежит в куке
Сообщение24.07.2018, 00:13 


10/03/16
4444
Aeroport
iifat

В них хранятся настройки запускаемого в браузере скрипта, который делает что то, что «отправителю» куки не очень бы хотелось афишировать пользователю

 Профиль  
                  
 
 Re: Что лежит в куке
Сообщение24.07.2018, 00:54 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
ozheredov в сообщении #1328309 писал(а):
Я думаю что по настоящему интересные куки сильно обфусцированы.
По-настоящему интересных кук (куков?) не бывает. Они нужны только для идентификации пользователя ("это тот Вася Пупкин из деревни Гадюкино, что заходил на прошлой неделе"), всю остальную информацию гораздо надежнее хранить у себя. У Васи в куках достаточно оставить запись "пользователь номер 1234567890 - сайт http://www.site.com", а всю информацию о Васе можно сохранить в БД на сервере, пометив "данные о пользователе номер 1234567890".

 Профиль  
                  
 
 Re: Что лежит в куке
Сообщение24.07.2018, 02:01 
Заслуженный участник


16/02/13
4194
Владивосток
ozheredov в сообщении #1328437 писал(а):
запускаемого в браузере скрипта
Скрипты в браузере открыты. Протокол легко перехватываем пользователем. Хранить там что-то секретное — неразумно.

 Профиль  
                  
 
 Re: Что лежит в куке
Сообщение28.07.2018, 23:26 


16/07/18

30
Dmitriy40 в сообщении #1328205 писал(а):
Скорее даже $a_{5..8}$ являются двумя 64-битными числами двух дат (окончания срока и создания), хранимыми каждое в виде двух 32-битных беззнаковых чисел начиная с младшего.

Утверждение , что $a_7$ и $a_8$ есть 64-битная запись времени создания кука, хранимое в виде двух 32-битных чисел , легко проверить, зная дату установки кука и сами значения $a_7$ и $ a_8$.
28.07.2018 21:39 даю разрешение на установку кука. В результате получаю кук, фрагмент которого привожу ниже (параметры $a_4… a_8$).
1088
3263117184
30680746
1629075564
30680738
Помогите найти связь между датой и зафиксированными параметрами

 Профиль  
                  
 
 Re: Что лежит в куке
Сообщение29.07.2018, 03:26 
Заслуженный участник


12/07/07
4522
Как и писал выше Dmitriy40,
    Пятая и шестая строка — FileTime окончания
    Седьмая и восьмая строка — FileTime создания.

Структура FileTime состоит из двух 32-разрядных значений, которые объединяются в единое 64-разрядное значение.
typedef struct _FILETIME {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME;

Результат преобразования указанного выше значения FileTime создания
FileTime -> Year, Month, Day, Hour, Min, Sec, MSec
(1629075564, 30680738) –> 2018, 07, 28, 21, 39, 55, 622

-- Sun 29.07.2018 03:06:21 --

Я просто в Delphi преобразовал
код: [ скачать ] [ спрятать ]
Используется синтаксис Delphi
Uses SysUtils, Windows;

var
 FileTime :_FileTime;
 Year, Month, Day, Hour, Min, Sec, MSec: Word;
 DateTime : TDateTime;

begin
 FileTime.dwLowDateTime  := 1629075564;
 FileTime.dwHighDateTime := 30680738;
 DateTime := FileTimeToDateTime(FileTime);
 DecodeTime(DateTime, Hour, Min, Sec, MSec);
 DecodeDate(DateTime, Year, Month, Day);
end.
 

 Профиль  
                  
 
 Re: Что лежит в куке
Сообщение29.07.2018, 21:15 
Заслуженный участник


12/07/07
4522
Преобразовывать к DateTime выше было конечно не обязательно. Можно почти сразу FileTime разобрать на отдельные составляющие при помощи функции FileTimeToSystemTime. Так как FileTime — UTC (Всемирное координированное время: ru.wiki, en.wiki), перед преобразованием нужно учесть часовой пояс.
Используется синтаксис Delphi
 Uses SysUtils, Windows;

var
 FileTime, LocalFileTime:  TFileTime;
 SystemTime: TSystemTime;

begin
 FileTime.dwLowDateTime  :=1629075564;
 FileTime.dwHighDateTime := 30680738;
 FileTimeToLocalFileTime(FileTime, LocalFileTime);
 FileTimeToSystemTime(LocalFileTime, SystemTime);
 with SystemTime do
  writeln(wDay,'.',wMonth,'.', wYear,' ',wHour, ':', wMinute, ':', wSecond:2, ':', wMilliseconds);
end.
И получим тот же результат, что и выше.

На всякий случай. В MatLab нет (по крайней мере, не было) «штатной» функции для преобразования UTC в DATENUM UTC2DATENUM will convert any UTC time to the correct MATLAB serial date number. Не нашёл такую функцию и в базовой поставке Octave.

 Профиль  
                  
 
 Re: Что лежит в куке
Сообщение31.07.2018, 09:01 


16/07/18

30
Пытаюсь получить значение даты менее экзотическим способом, вручную. Не получается. Либо алгоритм вычисления не верный, либо точность моих вычислений требует желать лучшего. Первое, что требуется по моему алгоритму, - определить длину временного интервала в миллиосекундах между двумя датами 1.1.1601, 00:00 и 28.07.2018 21:39. Искомая величина должна определяться на основании параметров $a_7$ и $a_8$. Помогите с формулой.

 Профиль  
                  
 
 Re: Что лежит в куке
Сообщение31.07.2018, 13:00 
Заслуженный участник


12/07/07
4522
Преобразовать младшую и старшую части 64-битного целого, заданные в десятичной системе, в 64-битное, заданное в десятичной системе, мне проще всего через шестнадцатеричную систему счисления. Преобразования можно выполнить вручную на бумаге или при помощи калькулятора Windows (вид «Инженерный»).

(1629075564, 30680738) -> (6119B86C, 1D426A2) -> 1D426A26119B86C -> 131772767956220012

-- Tue 31.07.2018 12:12:46 --

Результат — интервал в $10^{-7}\text{c}$. Чтобы получить в миллисекундах, достаточно сдвинуть вправо на 4 цифры: 13177276795622

-- Tue 31.07.2018 12:16:59 --

в общем случае с соответствующей коррекцией. (Но в данном случае и этого не надо.)

 Профиль  
                  
 
 Re: Что лежит в куке
Сообщение31.07.2018, 15:37 
Заслуженный участник


20/08/14
11760
Россия, Москва
Можно и без 16-тиричной системы, чисто калькулятором: (1629075564, 30680738) -> 1629075564+30680738*65536*65536=131772767956220012. В секундах будет 13177276795.

 Профиль  
                  
 
 Re: Что лежит в куке
Сообщение03.08.2018, 16:10 
Заслуженный участник


12/07/07
4522
toser в сообщении #1329705 писал(а):
Помогите с формулой.
Формулу я не знаю. По поводу самого преобразования FileTime в SystemTime.

При всей многобитности FileTime не учитывает добавленные (корректирующие или високосные) секунды. Следовательно, для получения в «удобном для человека» виде значения даты и времени можно просто учесть длительность лет, месяцев, дней,…

Если не стремиться к эффективности алгоритма, то можно поступить так.
1. Перебирая по очереди годы, начиная с 1601, найти полное число прошедших лет. (Вычитая по ходу из FileTime кол-во, приходящееся на очередной прошедший год.)
2. Найти количество прошедших месяцев в последнем (не завершенном) годе. (Попутно вычитая из FileTime кол-во, приходящееся на соответствующий месяц).
3. Найти день в текущем месяце (и вычесть из FileTime кол-во, приходящееся на прошедшие дни в текущем месяце).
4. Найти час, затем минуту, секунды и миллисекунды, попутно вычитая соответствующие кол-ва.
В результате FileTime будет содержать остаток.

Пример такой функции на Maple.
[Для лучшей читаемости часть исходного текста оформлено в виде двух вложенных функций:
DaysInMonth — возвращает по номеру месяца число дней в этом месяце;
IsLeap — проверка високосный ли год.
Передаваемое в качестве первого параметра значение FileTime присваивается локальной переменной FT_с.]
Код:
> # Описание констант
# CBinMilliS = 10000, CBinS = 1000*CBinMilliS, CBinM = 60*CBinS, CBinH = 60*CBinM
# CBinD  = 24*CBinH, # CnMinY = 365*CBinD, ClBinY = 366*CBinD;
> SystemTime := table(): # Определяем переменную, в которую будет возвращён результат

> macro(CnBinY = 315360000000000, ClBinY = 316224000000000, CBinD=864000000000, CBinH = 36000000000, CBinM = 600000000, CBinS = 10000000, CBinMilliS = 10000):

> FileTime2SystemTime := proc(FT, ST)::integer;
# InPut - FileTimeT
# OutPut – SystemTime
local Leap, FT_n, FT_c, IsLeap, i, DaysInMonth;

DaysInMonth:= proc(M::integer)::integer;
  # InPut: M - Month
  # Res: Days in Month
  if (M < 1) or M > 12 then error "M < 1 or M > 12"; end if;
  if member(M, {4, 6, 9, 11})
    then 30
    elif member(M, {1, 3, 5, 7, 8, 10, 12})
     then 31
    else `if`(Leap, 29, 28);
  end if;
end proc;

IsLeap:= yy -> (irem(yy, 4) = 0 and irem(yy, 100)<>0) or irem(yy, 400) = 0;

ST[Year]:= 1601; ST[Month]:=1; ST[Day]:=1;
ST[Hour]:=0; ST[Minute]:=0; ST[Milliseconds]:=0;
FT_c:= FT;
# Get Year
do
  if IsLeap(ST[Year]+1)
   then
     Leap:= true;
     FT_n:= FT_c - ClBinY;
   else
     Leap:= false;
     FT_n:= FT_c - CnBinY;
  end if;
  if FT_n >= 0
   then
    FT_c:= FT_n;
    ST[Year]:= ST[Year]+1;
   else
    break;
  end if;
end do:

# Get Month
if FT_c = 0 then return 0; end if;
FT_n:= FT_c;
for i from 1 to 12
  do
   FT_n:= FT_n - DaysInMonth(i)*CBinD;
   if FT_n < 0
     then
       ST[Month]:= i;
       break;
     else
       FT_c:= FT_n;
   end if;
  end do;

# Get Day
i:= iquo(FT_c, CBinD);
FT_c:= FT_c - i*CBinD;
ST[Day]:= i+1;
if FT_c = 0 then return 0; end if;

# Get Hour
ST[Day]:= iquo(FT_c, CBinH);
FT_c := FT_c - ST[Day]*CBinH;
if FT_c = 0 then return 0; end if;
# Get Minute
ST[Minute]:= iquo(FT_c, CBinM);
FT_c := FT_c - ST[Minute]*CBinM;
if FT_c = 0 then return 0; end if;

# Get Second
ST[Second]:= iquo(FT_c, CBinS);
FT_c:= FT_c - ST[Second]*CBinS;
if FT_c = 0 then return 0; end if;

# Get MilliSeconds
ST[Milliseconds]:= iquo(FT_c, CBinMilliS);
FT_c:= FT_c - ST[Milliseconds]*CBinMilliS;
return FT_c;
end proc:

Ес-но, вместо написания функции можно воспользоваться сервисом ОС: функцией FileTimeToSystemTime
Код:
# Создание the FileTimeToSystemTime Specification из kernel32.dll.
# Поскольку (по крайней мере, в старых версиях Maple)  при непосредственном обращении к функции из внешней dll
# автоматически преобразуются только структурированные типы  ARRAY, string[n], complex[4], complex[8], REF(type)
# FileTime определяется как int64 [8-байтное целое со знаком]
# SystemTime - как ARRAY(1..8, integer[2]) [8 целых со знаком]
> FileTimeToSystemTime := define_external('FileTimeToSystemTime', 'FileTime'::REF(integer[8]), 'SystemTime'::REF(ARRAY(1..8, integer[2])), LIB="kernel32.dll"):

Теперь задаём переменную со значением FileTim
Код:
#  Задаём значение FileTime
> FileTimeL := 1629075564:  FileTimeH:=30680738:
FileTime:= FileTimeL + FileTimeH*65536*65536:

Пример вызова самодельной функции
Код:
#SystemTime была определена выше, см. фрагмент с определением  FileTime2SystemTime
# Вызов самодельной функции
> FileTime2SystemTime(FileTime, SystemTime):
# Вывод результата преобразования на экран
> SystemTime[Year], SystemTime[Month], SystemTime[Day], SystemTime[Minute], SystemTime[Second], SystemTime[Milliseconds];
                              2018, 7, 28, 18, 39, 55, 622

Пример вызова функции kernel32.dll
Код:
# Определяем переменную ST, в которую будет возвращён результат
> ST:= Array(1..8, datatype=integer[2]):
# Вызываем функцию kernel32.dll
> FileTimeToSystemTime(FileTime, ST);
# Выводим на экран результат преобразования
> ST[1], ST[2], ST[4], ST[5], ST[6], ST[7], ST[8];
                              2018, 7, 28, 18, 39, 55, 622

UPD. В момент корректирующей секунды возможно расхождение результата возвращаемого самодельной функцией и FileTimeToSystemTime. Я не знаю деталей работы FileTimeToSystemTime. Самодельная функция не учитывает, что в минуте может быть 61 секунда. Но моменты эти достаточно редки: не чаще раза в году.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group