Как предотвратить отслеживание конфиденциальных данных в URL-адресах?

Некоторые URL-адреса в моем одностраничном приложении (SPA) содержат конфиденциальную информацию, такую ​​как токен доступа, информацию о пользователе и т. Д.

Примеры:

/callback#access_token=HBVYTU2Rugv3gUbvgIUY
/[email protected]

Я вижу, что hotjar позволяет подавлять элементы и изображения DOM из отслеживаемых данных. Можно ли скрыть параметры в URL или хотя бы отключить отслеживание для некоторых страниц?


person Taras Hupalo    schedule 10.02.2020    source источник
comment
Рассматривали ли вы возможность размещения этих данных в заголовках запросов с помощью AJAX?   -  person boosted_duck    schedule 19.02.2020
comment
Вы пытались получить доступ к этим данным через файлы cookie?   -  person Rajendra kumar Vankadari    schedule 20.02.2020


Ответы (3)


Поскольку вы говорите, что это ваш SPA, вы можете решить проблему, переключившись с запросов GET (которые имеют параметры внутри URL) на POST-запросы. Я не знаю hotjar, но если вы скажете службе отслеживания анализировать только URL-адреса, этот вариант стоит рассмотреть.

Другой часто используемый вариант - скрыть ваши параметры в URL-адресе, см., Например, Лучший способ скрыть адрес электронной почты на веб-сайт? Однако это никогда не было действительно безопасным решением для конфиденциальных данных, поскольку этап дешифрования слишком прост, в частности, если ваш посредник имеет все запросы, которые когда-либо отправлялись в ваш SPA.

Изменить. Я только что нашел в Hotjar разрешает RegEx. Предполагая, что вы можете ввести регулярное выражение частей URL, которые нужно исключить. Общий синтаксис /foo/bar/ означает, что foo следует заменить на bar, в нашем случае мы хотим удалить данный фрагмент, поэтому это /foo//.

Для данного случая токена доступа регулярным выражением будет

/callback#access_token=[a-zA-Z0-9]{15}//

и, соответственно, для электронной почты части URL-адреса

/\?email=(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])//

Этот второй RegEx частично взят из Как проверить адрес электронной почты используя регулярное выражение?

person B--rian    schedule 13.02.2020
comment
Это URL-адрес обратного вызова от сторонней службы. Я не могу это изменить. Имея этот токен из URL-адреса, кто-то может войти в приложение. - person Taras Hupalo; 14.02.2020
comment
Теперь я вижу проблему. Можете ли вы использовать другие службы отслеживания? - person B--rian; 14.02.2020
comment
@TarasHupalo У меня была еще одна идея, как решить вашу проблему. - person B--rian; 18.02.2020

Мне кажется, что разумно предположить, что сценарии отслеживания будут пытаться получить доступ к window.location.href или аналогичному, чтобы получить текущий URL-адрес, который они будут хранить.

Таким образом, возможным решением будет создание динамической области, которая имеет другое значение для window.location.href (с отфильтрованной всей конфиденциальной информацией)

Вот как это может работать:

// get the tracker script as a string, so you can eval it in a dynamic scope

let trackerScript = 'console.log("Tracked url:", window.location.href)';

// now lets lock it up
function trackerJail(){
  let window = {
    location: {
      // put your filtered url here
      href: "not so fast mr.bond"
    }
  }
  
  eval(String(trackerScript))
}

trackerJail()

Если фрагмент отслеживания заключен в функцию, можно было бы создать для него динамическую область действия без запуска eval, вместо этого переопределив его прототип. Но я не уверен, что вы можете рассчитывать на то, что скрипты трекера будут заключены в аккуратную функцию, которую вы можете изменить.

Кроме того, есть еще пара способов, которыми сценарий может попытаться получить доступ к URL-адресу, поэтому убедитесь, что закрыли все выходы.

person Marko Kacanski    schedule 19.02.2020
comment
(Не аффилировано) Напоминает мне систему песочницы figmas: figma .com / blog / how-we-built-the-figma-plugin-system. - person Seph Reed; 20.02.2020

Если вы управляете страницей и порядком сценариев, вы можете прочитать данные с URL-адреса, а затем удалить их, прежде чем что-либо еще сможет добраться до них.

proofOfConcept.html

<script id="firstThingToLoad.js">
    console.log(window.location.href);
    const keyRegex = /key=[^&]*/;
    const key = window.location.href.match(keyRegex);
    console.log("I have key", key);

    const href = window.location.href.replace(keyRegex, "");
    history.replaceState({}, "", href);
</script>

<script id="someSnoopyCode.js">
    console.log("I'm snooping: ", window.location.href);
</script>

<body>
    <a href="/?key=secret">Link to private</a>
</body>

Конечно, Link to private не должен существовать как есть. Кроме того, это нарушает обновление и большую часть навигации в целом, хотя есть способы поймать и сохранить это.

person Seph Reed    schedule 19.02.2020