Security TrackJS、GDPR和SPA

Security TrackJS、GDPR和SPA,security,data-security,trackjs,Security,Data Security,Trackjs,我在SPA中使用TrackJS,我有与GDPR相关的逻辑,所以在得到同意之前我不能发送任何数据 我发现onErrorconfig选项对此很有帮助。 但我仍然需要外部请求https://usage.trackjs.com/usage.gif。我可以通过一些技巧禁用它,但它看起来并不正确 那么如何防止使用呼叫呢 实施示例: import { TrackJS } from 'trackjs'; let GLOBAL_VARIABLE_IS_CONSENT_GIVEN = false; TrackJ

我在SPA中使用TrackJS,我有与GDPR相关的逻辑,所以在得到同意之前我不能发送任何数据

我发现
onError
config选项对此很有帮助。 但我仍然需要外部请求
https://usage.trackjs.com/usage.gif
。我可以通过一些技巧禁用它,但它看起来并不正确

那么如何防止使用呼叫呢

实施示例:

import { TrackJS } from 'trackjs';

let GLOBAL_VARIABLE_IS_CONSENT_GIVEN = false;

TrackJS.install({
  usageURL: '#', // disable usage call
  onError: function() {
    if (!GLOBAL_VARIABLE_IS_CONSENT_GIVEN) {
      return false;
    }

    // other logic

    return true;
  },
});
我还发现SPA中的使用呼叫存在问题。它不会显示实际的页面查看结果。因此,支持手动调用使用请求将是一件好事,它将解决上述两个问题。 发现这是已知的限制:

Todd从这里开始。我不认为您需要缩短对GDPR使用的调用,因为它不包含任何特定于用户的数据。它只是一个给定应用程序已加载多少次的计数器

使用仅发送:

  • 帐户令牌
  • 我想申请
  • 为唯一性生成的标识符
这些都不能追溯到用户,因此您应该能够继续并允许使用调用发生,并使用您描述的方法阻止错误在
onError
中发送


或者,我建议您延迟调用
TrackJS.install
,直到获得同意。这种方法的缺点是未捕获在同意之前发生的错误。但我想这就是用户想要的?

目前,我只找到了一种解决方法。 我编写了助手类,该类应用monkey补丁来防止发送使用调用和错误跟踪,直到允许为止。当您需要阻止加载外部脚本(例如我们已经使用的iubenda)时,通常会使用Monkey补丁

助手类:

class TrackJSUtil {
  static URL_PATTERN = /usage\.trackjs\.com/;

  /**
   * Keep usage url
   *
   * @private
   * @type {null|string}
   */
  usageUrl = null;

  /**
   * Is requests allowed
   *
   * @private
   * @type {boolean}
   */
  isRequestsAllowed = false;

  /**
   * Apply monkey patch
   */
  install() {
    if (this.isRequestsAllowed) {
      return;
    }

    const setUsageUrl = (value) => {
      this.usageUrl = value;
    };

    const ignore = () => this.isRequestsAllowed || this.usageUrl != null;

    const createElementOriginal = document.createElement.bind(document);

    document.createElement = function createElementForTrackJS(...args) {
      const element = createElementOriginal(...args);

      if (ignore() || element.tagName.toUpperCase() !== 'IMG') {
        return element;
      }

      Object.defineProperty(element, 'src', {
        get() {
          return this.getAttribute('src');
        },
        set(value) {
          if (TrackJSUtil.URL_PATTERN.test(value)) {
            setUsageUrl(value);
          } else {
            this.setAttribute('src', value);
          }
        },
      });

      return element;
    };
  }

  /**
   * Callback for onError in TrackJS
   * @return {boolean}
   */
  onTrackJSError() {
    return this.isRequestsAllowed;
  }

  /**
   * Call it when requests are allowed
   */
  allow() {
    if (this.isRequestsAllowed) {
      return;
    }

    this.isRequestsAllowed = true;

    if (this.usageUrl == null) {
      return;
    }

    document.createElement('img').src = this.usageUrl;
  }
}
用法:

import { TrackJS } from 'trackjs';

const util = new TrackJSUtil();

if (IS_CONSENT_GIVEN) {
  util.allow()
} else {
  callItWhenConsentGiven(() => {
    util.allow();
  });
}

util.install();

TrackJS.install({
  onError: () => util.onTrackJSError(),
});

我们不应该延迟初始化,因为我们可能会丢失所有客户的大部分错误,所以我们应该先初始化TrackJS,否则它将不会真正有用。我在推特上读到你是GDPR公司的帖子,但我们负责GDPR的法律人员说“遵守GDPR和必不可少不一样”。作为开发人员,对我来说,最好的选择是扩展API以阻止使用调用。在这种情况下,我们将确保在获得同意之前不会发送任何“非必要”电话。有可能吗?如果您添加对手动呼叫使用请求的支持,将至少解决两个问题:GDPR和SPA中的导航。更新的问题描述Interesting solution Alexandr!我会考虑把这样的东西交给经纪人。如果有像这样的API:``TrackJS.install({capture:false});//获得同意后,TrackJS.enable();//这将发送使用情况并清除任何缓存错误``嗨,托德,这将是非常棒的。我很快为它编写了样本和测试,如果它符合您的意思,它将解决我们与GDPR的问题。不要忘记内存,需要限制保存的错误数量并清除引用以防止内存泄漏。嘿@ToddGardner,只是为了确保您阅读了上面的评论。谢谢Alexandr!这看起来是一个很好的解决方案,我们可以添加离线支持作为其中的一部分。我已经将此添加到我们的待办事项中,我们将很快制定计划。