Как отслеживать использование определенного куки в JavaScript? - PullRequest
0 голосов
/ 21 октября 2018

Я пишу сценарий с целью отслеживания использования любого конкретного файла cookie в JavaScript.Это звучит странно, но вот контекст: я хотел бы провести исследование того, действительно ли куки-файлы без флага HTTPOnly используются в клиентском JavaScript.Как вы, возможно, знаете, флаг HTTPOnly в файле cookie делает его недоступным для клиентского JavaScript, что помогает предотвратить кражу файлов cookie при атаке XSS.Я предполагаю, что большинство файлов cookie без флага HTTPOnly не используются в клиентском JavaScript и не являются только HTTPOnly, потому что это настройка по умолчанию.

Мой текущий план - написать свой собственный скрипт в Node.js, которыйзапросит определенную веб-страницу и эмулирует ее с помощью пакета jsdom .Единственная причина, по которой я планирую использовать Node.js, заключается в том, что я не только знаком с ним, но и являюсь его родным для JavaScript, что должно упростить эмуляцию или анализ JavaScript на этом языке.Затем я добавлю свой собственный код JavaScript в начало веб-страницы, которая будет пытаться отслеживать использование файлов cookie.Итак, в основном вот модель:

Запрос содержимого веб-страницы (с модулем request ) → Добавьте тег html к началу веб-содержимого, который будет включать некоторый код, который будет отслеживать использованиефайлов cookie → Используйте модуль jsdom для эмуляции конечного веб-сайта.

Однако, поскольку JavaScript взаимодействует с файлами cookie таким образом, что затрудняет отслеживание того, какие конкретные файлы cookie используются, яне уверен, как это сделать.В настоящее время у меня есть способ создать собственный метод получения и установки для document.cookie, который позволяет мне входить в консоль всякий раз, когда к документу обращаются или устанавливают что-либо.Вот этот код:

<script>
var originalCookieGetter = document.__lookupGetter__('cookie').bind(document);
var originalCookieSetter = document.__lookupGetter__('cookie').bind(document);

Object.defineProperty(document, 'cookie', {
    get: function () {
        console.log('GET COOKIES');
        return originalCookieGetter();
    },
    set: function (val) {
        console.log('SET COOKIES: ' + val);
        originalCookieSetter(val);
    }
});

</script>

Однако это по-прежнему затрудняет отслеживание того, какие файлы cookie используются, поскольку document.cookie возвращает строку из всего списка файлов cookie, которую пользователь затем должен будет выполнить.манипулировать с помощью String.split () или других функций.Кроме того, пользователь может установить другую переменную, равную выводу document.cookie, что может привести к потере возможности отслеживать использование.На самом деле, этот подход может вообще не работать.Возможно, мне придется смотреть на гораздо более низкий уровень, чем этот, например, анализ памяти.

Наконец, я также считал, что эмуляция кода может быть необязательной.Конечно, я мог бы составить список всех сценариев в виде строк и попытаться найти определенные шаблоны в строках.Например, если на веб-сайте есть файл cookie с именем «user_session_id», я мог бы найти эту строку в коде.Возможные варианты:

1) Эта строка может использоваться в случаях, которые не относятся к файлам cookie (например, имя какой-либо другой переменной)
2) Эта строка может храниться впеременная, тогда, когда эта переменная будет использована, я не смогу сказать
3) Вам не нужно имя файла cookie, чтобы получить его значение через document.cookie

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

Кроме того, этот код не должен работать буквально с каждым крайним случаем.Я планирую использовать этот метод только на 100 самых популярных веб-сайтах Amazon Alexa, возможно, больше или меньше.

...