Как предотвратить отслеживание конфиденциальных данных в URL? - PullRequest
7 голосов
/ 10 февраля 2020

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

Примеры:

/callback#access_token=HBVYTU2Rugv3gUbvgIUY
/?email=username@example.com

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

Ответы [ 3 ]

2 голосов
/ 19 февраля 2020

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

Таким образом, возможное решение - создать динамический c область действия, которая имеет другое значение для 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()

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

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

2 голосов
/ 20 февраля 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 не должно существовать как есть. Кроме того, это нарушает refre sh и большую часть навигации в целом, хотя есть способы перехватить и сохранить это.

2 голосов
/ 13 февраля 2020

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

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

Edit. Я только что нашел в 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 частично взят из Как проверить электронную почту адрес с использованием регулярного выражения?

...