Google跟踪代码管理器包括在Apache中传递mod-security规则

und*_*Pez 4 apache iframe mod-security google-tag-manager

我一直在寻找在我的网站上使用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 -->
Run Code Online (Sandbox Code Playgroud)

来自mod-security的回复:

WARNING:    Possibly malicious iframe tag in output
Message:    Outbound Anomaly Score Exceeded (score 15): Possibly malicious iframe tag in output
Run Code Online (Sandbox Code Playgroud)

触发的规则是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*)?%)"
Run Code Online (Sandbox Code Playgroud)

und*_*Pez 9

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

<!-- 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 -->
Run Code Online (Sandbox Code Playgroud)

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

.noDisplay {
display:none;
visibility:hidden;
}
Run Code Online (Sandbox Code Playgroud)

该代码现在传递mod安全性,并在页面中包含GTM(几乎)与Google的预期方式相同.

我希望能帮助别人解决同样的问题:-)


Hen*_*und 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 -->
Run Code Online (Sandbox Code Playgroud)

添加得尽可能高<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) -->
Run Code Online (Sandbox Code Playgroud)

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

.noDisplay {display:none;visibility:hidden;}
Run Code Online (Sandbox Code Playgroud)

所有的功劳都归功于@underscorePez 的原始解决方案,引导我找到上述内容!