Security TrackJS、GDPR和SPA
我在SPA中使用TrackJS,我有与GDPR相关的逻辑,所以在得到同意之前我不能发送任何数据 我发现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
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!这看起来是一个很好的解决方案,我们可以添加离线支持作为其中的一部分。我已经将此添加到我们的待办事项中,我们将很快制定计划。