4

我一直在考虑在我的网站上使用 Google 跟踪代码管理器,但由于默认的 Google 包含代码被我的服务器上的 mod-security 安装阻止,我在第一个障碍中失败了:

标准 GTM 包括代码:

<!-- Google Tag Manager -->
<noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-XXXXXX"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXXXX');</script>
<!-- End Google Tag Manager -->

来自 mod-security 的回应:

WARNING:    Possibly malicious iframe tag in output
Message:    Outbound Anomaly Score Exceeded (score 15): Possibly malicious iframe tag in output

触发的规则是 ids 981000 和 981001。

我可以理解为什么 mod-security 可能认为带有“display:none;visibility:hidden”的 iframe 可能是恶意的,并且删除 style 属性会阻止规则 981001 触发,但由于规则 981000,请求仍然失败。

981000 似乎对宽度和高度属性应该是什么有强烈的看法,但我尝试将它们设置为“1”和“10”无济于事:-(

有谁知道如何格式化 iframe 以适应此规则?或者如何更改 GTM 包含代码,使其不包含 iframe?

谢谢

PS:我知道你可以通过删除整个noscript区域来解决这个问题,但我正在寻找一种不会改变包含代码功能的解决方案。

PPS:这是规则 981000 匹配的模式,在我的大脑在嵌套的捕获组云中爆炸之前我可以理解大约一半;-)

Pattern match "<\W*iframe[^>]+?\b(?:width|height)\b\W*?=\W*?["']?[^"'1-9]*?(?:(?:20|1?\d(?:\.\d*)?)(?![\d%.])|[0-3](?:\.\d*)?%)"
4

2 回答 2

10

经过大量实验 - 我发现以下代码有效:

<!-- Google Tag Manager -->
<noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-XXXXXX"
height="21" width="21" class ="noDisplay"></iframe></noscript>
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXXXX');</script>
<!-- End Google Tag Manager -->

似乎规则 981000 将触发任何小于 21 像素或宽度或高度小于 3% 的 iframe。将可见性和显示样式信息移动到外部样式表会阻止触发规则 981001。

.noDisplay {
display:none;
visibility:hidden;
}

该代码现在通过了 mod 安全性,并以(几乎)Google 预期的方式在页面中包含 GTM。

我希望这可以帮助其他人在同样的问题上苦苦挣扎:-)

于 2014-04-11T14:25:45.740 回答
5

很好的解决方案,感谢您发布答案!时间紧迫,急需帮助!

新推荐的 GTM 实现建议将代码分成两部分,所以为了大家的利益,这里是我如何修改上述答案以符合首选实现。它还可以防止 403 禁止错误。

尽可能高地添加<head>

<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXXXX');</script>
<!-- End Google Tag Manager -->

尽可能高地添加<body>

<!-- Google Tag Manager (noscript) -->
<noscript><iframe src=""https://www.googletagmanager.com/ns.html?id=GTM-XXXXXX""
height=""21"" width=""21"" class =""noDisplay""></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->

要添加到外部样式表(通常是 style.css)中:

.noDisplay {display:none;visibility:hidden;}

@underscorePez 的所有功劳归于原始解决方案,导致我达到上述目的!

于 2017-06-20T10:57:26.353 回答