2014 dxdy logo

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

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




 
 Что лежит в куке
Сообщение22.07.2018, 12:28 
Любопытства ради, залез в каталог, куда мой браузер(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 
 i  Тема перемещена из форума «Computer Science» в форум «Компьютерные сети и Web-технологии»
Причина переноса: тематика.

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

 
 
 
 Re: Что лежит в куке
Сообщение22.07.2018, 16:22 
$a_4$ какие-то битовые флаги.
$a_6$ похоже на срок действия.
$a_8$ похоже на дату создания.
$a_5$ и $a_7$ могут быть дробными частями следующих дат. Во всяком случае явной закономерности в этих двух не вижу. Скорее даже $a_{5..8}$ являются двумя 64-битными числами двух дат (окончания срока и создания), хранимыми каждое в виде двух 32-битных беззнаковых чисел начиная с младшего.

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

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

 
 
 
 Re: Что лежит в куке
Сообщение23.07.2018, 10:46 
ozheredov в сообщении #1328309 писал(а):
по-настоящему интересные куки
Полагаете, в них хранится информация, где владелец сервера зарыл свой клад? Сомневаюсь.

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

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

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

 
 
 
 Re: Что лежит в куке
Сообщение24.07.2018, 02:01 
ozheredov в сообщении #1328437 писал(а):
запускаемого в браузере скрипта
Скрипты в браузере открыты. Протокол легко перехватываем пользователем. Хранить там что-то секретное — неразумно.

 
 
 
 Re: Что лежит в куке
Сообщение28.07.2018, 23:26 
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 
Как и писал выше 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 
Преобразовывать к 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 
Пытаюсь получить значение даты менее экзотическим способом, вручную. Не получается. Либо алгоритм вычисления не верный, либо точность моих вычислений требует желать лучшего. Первое, что требуется по моему алгоритму, - определить длину временного интервала в миллиосекундах между двумя датами 1.1.1601, 00:00 и 28.07.2018 21:39. Искомая величина должна определяться на основании параметров $a_7$ и $a_8$. Помогите с формулой.

 
 
 
 Re: Что лежит в куке
Сообщение31.07.2018, 13:00 
Преобразовать младшую и старшую части 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 
Можно и без 16-тиричной системы, чисто калькулятором: (1629075564, 30680738) -> 1629075564+30680738*65536*65536=131772767956220012. В секундах будет 13177276795.

 
 
 
 Re: Что лежит в куке
Сообщение03.08.2018, 16:10 
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 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group