Как гарантировать, что значение отпечатка не было подделано в запросе со стороны клиента
Отпечаток пальца JS рассчитывается на стороне клиента с использованием такой библиотеки, как fingerprint2.
Мой вопрос: если я отправлю это значение через ajax, пользователь сможет подделать это значение с небольшим усилием и просто сделать поддельный почтовый запрос, который будет интерпретироваться серверным кодом как легальный.
Мой вопрос: если это может произойти, эту библиотеку можно легко обойти, даже не меняя никаких свойств в браузере (это изменит отпечаток браузера).
Моя интерпретация верна? Как я могу обеспечить целостность этой ценности?
3 ответа
Вы не можете, и я бы не стал беспокоиться об этом.
Правило № 1: Все входные данные, поступающие с компьютера пользователя, могут быть подделаны и на них нельзя полагаться на 100%.
Если вы хотите, вы можете удвоить отпечатки пальцев на сервере и использовать библиотеки в качестве детектора устройств piwik для сопоставления данных, но у вас бесполезная головная боль.
90% пользователей, посещающих вас, не будут иметь понятия о том, что вы делаете, и предоставят вам надежные данные. У них даже не будет рекламного блока. Они дадут вам надежные данные.
9% посетителей могут иметь блокировщик рекламы, который может блокировать или не блокировать эти запросы AJAX. Они хотят, чтобы вы уважали их конфиденциальность, делайте так, чтобы вы оставляли их как клиентов. 1% могут знать, что делают эти ajax-запросы, но они никогда не узнают, потому что они не могут потрудиться проверять консоль каждого веб-сайта, который они посещают. 1% из этого 1% может взглянуть на консоль браузера и выяснить отпечатки пальцев браузера.
1% от этого 1% от этого 1% украдут ваш код для снятия отпечатков пальцев. еще 1% из 1% из 1% попытаются подделать его только для лулзов, а затем забудут об этом.
Короче, не беспокойтесь. люди не будут беспокоить либо.
Но если вы действительно должны беспокоиться и причинять себе головную боль
- сохраните идентификатор пользователя в своей базе данных на клиентском компьютере в виде файла cookie для отслеживания. Также сохраните его в хранилище сеансов, локальном хранилище, в любых движках баз данных, которые может предоставить браузер. (обратите внимание, что вы должны указать это в своем отказе от использования файлов cookie, почему вы храните данные на компьютере пользователя, когда европейские пользователи посещают ваш сайт)
- используйте этот идентификатор пользователя для сопоставления отпечатков пальцев с пользователем. Обратите внимание, что этот идентификатор может быть удален в любое время любым механизмом очистки кэша (cccleaner, антивирусный сканер, пользователь нажимает на пустую историю и т. Д.)
- поместите идентификатор пользователя в объект window.name. Пока вкладка открыта, она будет сохранена, и попытайтесь сбросить / сохранить ее на компьютере пользователя.
- Добавьте E-TAG к вашим изображениям, компьютер пользователя попытается запросить это изображение с этим номером etag в следующий раз, когда он придет. Перехватите этот запрос (не позволяйте веб-серверу обрабатывать его, но обрабатывайте его в php/jsp/asp/ что угодно), чтобы вы могли идентифицировать пользователя. Установите переменную сеанса с правильным идентификатором пользователя и "ответьте", что изображение по-прежнему является действительным для этого значения etag, и верните с помощью cookie правильный идентификатор пользователя
- поместите значения "timestamp" за запросом javascript на основе идентификатора пользователя и задайте срок действия запрашиваемой страницы, включая этот файл javascript, через 180 дней или около того. Каждый раз, когда пользователь возвращается и пользователь не очистил свою историю, он выполнит запрос javascript с заданным параметром "timestamp" get
gotcha.js?time=1283737273873
используйте серверный сценарий снова, чтобы перехватить. Затем вы можете использовать ajax для обновления содержимого страницы. - добавить что-то вроде карт Google на своей странице. Если они используют gmail или какой-либо сервис Google и дали согласие Google на установку файлов cookie, Google выгрузит свой браузер, полный файлов cookie, которые могут сохраняться некоторое время. Файлы cookie карт Google остаются неизменными, по крайней мере, в течение сеанса работы в браузере, и их можно прочитать с помощью сценария javascript /serveride.
- используйте детектор устройств piwik, чтобы создать отпечаток браузера на стороне сервера, используйте его, чтобы сузить догадки относительно того, каким пользователем он является.
- закодируйте ваш запрос как байтовый буфер / поток, а base64 закодируйте его, чтобы угадать, что его сложнее, даже если base64 декодирует его и отправит запрос в двух частях, одна с проверочным хешем, а другая с отпечатком пальца. затем сопоставьте хеш и его содержимое, и, если оно совпадает, вы можете быть уверены, что, если оно подделано, кто-то приложил немало усилий.
- минимизируйте и запутывайте ваш код, также на многих бесполезных переулках в вашем коде javascript. Поместите каждую строку в ее собственную функцию и объедините их в цепочку, чтобы сделать единое целое. приложите слишком много усилий, чтобы вычесть то, что там происходит.
Кроме того, я действительно могу рекомендовать вас: не беспокойтесь. это не стоит усилий. люди, которые хотят обойти, обойдутся. они отключают JavaScript, исключают этот сценарий, стирают все куки перед продолжением или уходом с сайта, меняют плагины зарегистрированных шрифтов и т. д. Не преследуйте тех, кто не хочет, чтобы за ними следили. Сосредоточьтесь на группе, которой все равно.
Как я могу обеспечить целостность этой ценности?
Чтобы ответить вам очень кратко, всякий раз, когда вы хотите защитить свою целостность, вы также должны предоставить дайджест отправленного сообщения.
Здесь я объясняю защиту целостности с использованием Алисы (FrontEnd), Боба (BackEnd) и Труди (злоумышленник)
Предположение:
Алиса хочет отправить пакет содержит PLAIN_TEXT
(здесь ваш отпечаток) Бобу, а Труди - злонамеренный человек, который хочет перехватить пакет и изменить PLAIN_TEXT
,
Угрозы против целостности:
Труди может захватить PLAIN_TEXT
и измени его на то, что она хочет. (В действительности может быть больше угроз против целостности, но я хочу, чтобы история была короткой.)
Вот шаги, которые Алиса должна предпринять для защиты целостности пакета:
- Алиса получает дайджест
PLAIN_TEXT
(называетсяtext_digest
). - Алиса прикрепляет дайджест к
PLAIN_TEXT
и получить новыйpackage
(package
знак равноPLAIN_TEXT
+text_digest
) - Алиса шифрует
package
- Алиса получает дайджест зашифрованного пакета (
whole_package_digest
) - Алиса присоединяет
whole_package_digest
в зашифрованный пакет, и отправьте его Бобу
Что Труди может сделать после намерения:
Вариант 1. Попробуйте сломать шифрование пакета
Вариант 2. Попробуйте опустить encrypted package
и приложить ее собственный пакет.
На стороне Боба:
Он расшифровывает
package
и получаетPLAIN_TEXT
, (он следит за тем, чтобы Алиса отправила этот пакет, потому что ни у кого больше нет ключа)Он получает дайджест
PLAIN_TEXT
используя тот же метод (давайте назовем этоobtained_digest
), и он сравниваетobtained_digest
сtext_digest
и если они равны, то это означает, чтоPLAIN_TEXT
не манипулировать.В конце он получает дайджест полученной посылки и сравнивает его с
whole_package_digest
, Если они равны, это означает, что Труди потерпела неудачу с ее вторым вариантом.
Обратите внимание, что в приведенном выше сценарии целостность в значительной степени зависит от конфиденциальности. Но, вы можете использовать как симметричный, так и асимметричный метод для шифрования.
На изображении ниже я попытался объяснить то, что хотел сказать более четко:
Проверка целостности отпечатка на стороне клиента невозможна... Лучше всего для вас использовать PHP для обнаружения внутренних систем... Я написал для этого библиотеку, но не опубликовал... Если вам это нужно, я могу отправить это вам...
Что делает эта библиотека, так это определяет Mac-адрес устройства... Поскольку две системы не могут иметь одинаковый Mac-адрес... Это очень хороший способ получить точный отпечаток пальца.