谷歌广告联盟的JavaScript错误

79

我在运行AdSense的几个网站上遇到以下错误:

无法将消息发布到 [http://]googleads.g.doubleclick.net。接收方具有来源http://www.anekdotz.com

不安全的JavaScript尝试访问带有URL [http://]www.anekdotz.com/ 的框架, 来自带有URL [http://]googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9099580055602120&output=html&h=250&slotname=9210181593&w=300&flash=10.0.42&url=http%3A%2F%2Fwww.anekdotz.com%2F&dt=1269901036429&correlator=1269901036438&frm=0&ga_vid=711000587.1269901037&ga_sid=1269901037&ga_hid=654061172&ga_fc=0&u_tz=-240&u_his=2&u_java=1&u_h=900&u_w=1440&u_ah=878&u_aw=1436&u_cd=24&u_nplug=10&u_nmime=101&biw=1365&bih=806&eid=44901212&fu=0&ifi=1&dtd=153&xpc=Xkfk1oufPQ&p=http%3A//www.anekdotz.com域,协议和端口必须匹配。

(来自Chrome JavaScript控制台)

广告似乎正常显示,不影响我的本地JavaScript代码。 但是有时候这些错误似乎会减缓页面加载速度。 我该如何解决这个问题?

(我修改了URL以使其适用于新用户)


anekdotz.com是你的网站吗? - Pekka
1
这里也有同样的问题。这篇帖子已经发布了将近一年了!如果这是一个谷歌的问题,为什么还没有解决呢?它还会影响网站上的其他JS。根据这个链接,似乎只与排行榜广告有关...http://www.google.com/support/forum/p/AdSense/thread?tid=4045dd1fdae7ff47&hl=en - UpTheCreek
将问题提交给谷歌 AdSense。 - Incognito
3
跟谷歌地图嵌入框架一样,是的,谷歌可以打破规则。希望这不会破坏搜索引擎优化排名;-) - Jacob Lowe
这个问题解决了吗?我遇到了同样的错误 无法将消息发布到 http://googleads.g.doubleclick.net。接收方源自 http://www.mydomain....,但我无法解决它!我已经在最新版本的 Chrome、FF 7、IE8 和 9 以及最新版本的 Safari 上进行了测试。 - basZero
显示剩余2条评论
9个回答

81

谷歌的脚本出了问题。你无法做太多事情。

由AdSense脚本包含在父页面中的http://pagead2.googlesyndication.net/pagead/expansion_embed.js,因某种原因尝试使用新的HTML5postMessage功能将有关广告的信息发送到新编写的<iframe>中以容纳广告:

            ha(this, function (f, e) {
                d[Pa](this.a[A]+"|"+f+":"+e, this.la)
            });

嗯,代码被压缩/混淆过了。相信我,Pa 就是 'postMessage'

在这个调用中,this.la 中的 targetOrigin 参数被设置为 http://googleads.g.doubleclick.net。然而,新的 iframe 的 src 被设置为 about:blank。这与目标来源不匹配,因此浏览器必须拒绝发送消息。只有 Chrome 看起来会在控制台日志中记录实际的问题。

我完全不知道它为什么要这样做,更别提为什么它不仅使用 '*' 作为目标源了... 我现在也不想深入分析混淆的脚本了。但是,这个错误不应该导致页面加载变慢。如果你看到暂停,通常是由于解析和获取其他外部脚本。


嗨,谢谢你提醒。我不确定它是否真的会减慢页面加载速度,但它会在页面已经加载完成时弹出浏览器的“正在加载页面”的通知。这很烦人,可能也会让一些用户认为他们需要等待直到浏览器停止。我希望他们能尽快解决这个问题。 - Arjun
4
我也遇到了这个错误,不是特别缓慢,但我意识到它会导致其他JS停止工作,比如FB社交应用程序集成。我想知道为什么这个问题还没有被修复。 - Mescalito
我可以补充一点:这只发生在我安装了广告拦截器的特定Chrome会话中。我已经为特定的URL禁用了插件,但仍然触发了源错误消息。如果在隐身窗口中打开相同的网站,则问题消失了。 - Andres SK
这个答案在2018年仍然有效吗? - Gabriel

15

谷歌正在尝试利用浏览器的一个特别之处,即某些浏览器忽略了about:blank作为URL的窗口的同源策略,从而允许该窗口向任何站点提交XMLHttpRequest或者在这种情况下,postMessage请求。

据我所知,最近浏览器已经禁用了这种行为。您可能使用的是已修补过的浏览器。

希望这个破损的功能不会影响您通过广告赚钱的能力。

虽然你的网站因他人的Javascript代码而产生错误很烦人,但当你在自己的页面上运行他人的Javascript时,这确实是一个必须接受的可能性。


允许该窗口向任何站点提交 postMessage 请求,这怎么成为了漏洞?postMessage 可以在任何视图中调用,无需考虑同源限制。 - Eli Grey
1
它确实可以被称为那样。但是,消息本身是否被发送取决于消息被接收时目标窗口是否具有postMessage的第二个参数所描述的来源。看起来这里不是这种情况。(至于为什么它可能成为漏洞,引用MDC的话:“如果使用postMessage传输密码,那么对于包含密码的消息的预期接收者,该参数必须是一个URI,其来源与密码的预期接收者相同,以防止恶意第三方拦截密码。”) - Jeff Walden

8

这是正常的,因为您的浏览器防止其他网站进行CSRF攻击。

要允许googleads...访问您的网站并解决此问题,请在您的Web根目录下创建一个名为crossdomain.xml的文件,并将其填充以下内容:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy 
  SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
  <allow-access-from domain="googleads.g.doubleclick.net" />
</cross-domain-policy>

为了测试它,访问你的域名http://your-domain.com/crossdomain.xml,确保该页面没有任何错误。你也可以使用通配符等(请参考参考资料)。完成后,请刷新你的页面。 希望这能帮到你。
实例: http://www.blanjamudah.com/crossdomain.xml 参考资料: http://en.wikipedia.org/wiki/Cross-site_request_forgery http://curtismorley.com/2007/09/01/flash-flex-tutorial-how-to-create-a-crossdomainxml-file/

1
这对我没有用,可能与Flash Player有关。 - fmalina

4

对于那些在搜索域名和协议错误代码后着陆在此页面的人:

AdSense已发布了一个新的异步版本的JavaScript,解决了我们使用旧的嵌入代码时生成的跨域错误。当我们在我们AJAX-heavy网站上使用他们的标准嵌入代码时,我们得到了跨域错误。当我们实现了他们的异步代码,并结合正确定义的crossdomain.xml文件时,跨域错误消失了。


4

1

我遇到了类似的问题。不确定是否相关,但我还是会解释一下。

我的页面上有两个广告,我想通过只在页面末尾调用脚本来“重构”代码:

<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

我的广告出了问题,我发现必须在每个广告变量脚本后面放置这个脚本标签。
<script type="text/javascript"><!--
google_ad_client = "ca-pub-872346872364872364";
google_ad_slot = "719238712983";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>

但是,当我撤销了我的更改后,第一个脚本标签仍然被放置在页面底部,因此尝试将我的另一个脚本标签作为广告加载。这失败了,你看到了这个错误。
因此,请确保你将两个广告脚本标签放在彼此之后而不是其他地方,例如:
<script type="text/javascript"><!--
google_ad_client = "ca-pub-872346872364872364";
google_ad_slot = "719238712983";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

1

只需将<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>从广告下方移到页面顶部即可解决此问题。


奇怪的行为 - Niresh

1

这似乎是错误消息掩盖了真正的原因。真正的原因可能是某种广告联盟的配置错误;不幸的是,广告联盟似乎没有进行足够的检查以提供更相关的错误消息。

我自己也遇到了这个错误,在研究论坛后得出了这个结论,一些人报告说在验证他们的银行账户或其他信息后问题得到了解决。在我的情况下,我的服务器端环境正在处理google_ad_client参数,所以真正的问题是该参数为空。一旦我解决了这个问题,广告就开始显示了,而且没有出现错误消息。

因此,在实践中,这与同源策略实际上没有任何关系。现在广告联盟代码正确后,我甚至可以在本地主机和服务器上显示广告。


0
在您的Google Adsense仪表板(Web或应用程序版本)的“网站”选项卡中,请确保您的网站设置为your-domain.com(或任何其他顶级域名)作为域名,www.your-domain.com作为子域名。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接