【问题标题】:Google Tag Manager include that passes mod-security rules in Apache谷歌标签管理器包括在 Apache 中通过 mod-security 规则
【发布时间】:2014-04-09 13:40:40
【问题描述】:

我一直在考虑在我的网站上使用 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*)?%)"

【问题讨论】:

    标签: apache iframe google-tag-manager mod-security


    【解决方案1】:

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

    <!-- 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 -->
    

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

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

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

    我希望这可以帮助其他遇到同样问题的人:-)

    【讨论】:

      【解决方案2】:

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

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

      要在&lt;head&gt; 尽可能高的位置添加:

      <!-- 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 -->
      

      要在&lt;body&gt; 尽可能高的位置添加:

      <!-- 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-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-14
        • 2018-04-13
        • 1970-01-01
        • 2014-07-15
        • 1970-01-01
        相关资源
        最近更新 更多