位置.href返回奇怪的URL

9
我正在使用location.href来获取浏览器地址栏中存在的完整URL。
需要提供更多细节的是,我们的服务有一个JS文件,将包含在我们客户的网站中。因此,这个JS文件将生成申请人的完整URL。

我认为这个URL可能是之前重定向到真实域名的URL,但是我应该如何防止这个操作?

生成iframe的src属性链接的JS代码行是:

'http://sd.domain.ir/index.php?r=' + Math.floor(Math.random() * (100000000 - 0 + 1)) + 0 + '&ref=' + ((window.btoa) ? btoa(location.href) : 'ie') + '&responsive=' + ((document.querySelector('meta[name="viewport"][content*="width=device-width"]')) ? 'yes' : 'no') + '&params='

申请人UA示例:
Mozilla\/5.0(Linux; U; Android 4.3; en-us; HUAWEI G620-L72 Build\/HuaweiG620-L72)AppleWebKit\/534.24 (KHTML, like Gecko)Version\/4.0 Mobile Safari\/534.24 T5\/2.0 bdbrowser\/6.1.0.4

Mozilla\/5.0(Linux; U; Android 4.4.3; en-ae; HTC_One Build\/KTU84L)AppleWebKit\/534.30 (KHTML, like Gecko)Version\/4.0 Mobile Safari\/534.30

Mozilla\/5.0(Linux; U; Android 4.3; en-us; GT-I9300 Build\/JSS15J)AppleWebKit\/534.30 (KHTML, like Gecko)Version\/4.0 Mobile Safari\/534.30

...

有时会出现由 location.href 生成的奇怪URL,我不知道原因。例如:

主URL如下所示: http://saten.ir/tag/%D8%A8%DB%8C%D9%88%DA%AF%D8%B1%D8%A7%D9%81%DB%8C-%D8%A7%D9%85%DB%8C%D8%B1%D8%B9%D8%A8%D8%A7%D8%B3-%D9%81%D8%AE%D8%B1%D8%A2%D9%88%D8%B1/

但是location.href返回的URL如下:
http://www.google.com/search?site=&source=hp&q=%E7%88%B1%E5%9B%BE%E7%BD%91&btnI


我无法在Chrome中复制该问题 - window.location.href应始终返回当前页面的URL,我唯一能想到的例外情况是如果使用了HTML5 History API进行了更改。您使用了特定的浏览器或过程来产生此问题吗? - Brian
1
我仍然无法使用UA欺骗和Chrome“仿真”重现此问题。 我认为我之前提到过,但您确定它记录的是location.href而不是document.referrer吗? 我唯一想到的其他想法是,也许问题并未发生在主页上 - 可能将GET请求记录到内联脚本/ div中,以便可以通过您的日志脚本传递回来可能会有所帮助,这样我们可以手动将请求映射到URL并尝试缩小如何重现该问题的范围。 - Brian
@Brian 是的,我确定要使用location.href,不幸的是我不明白你说了什么。:( - Hossein Shahsahebi
@ShoaibKonnur 这些信息是离线的,这意味着某个用户访问了一个已知网站,该网站具有我们的js代码,然后我们将通过location.href获取其当前URL并将其发送到服务器。最后,服务器将使用接收到的URL生成日志。 - Hossein Shahsahebi
@Brian 感谢您的回复,目前我已经有了预期的申请者域,并且我可以说例如 something.com 发送这个不相关的 URL 作为它的 href。但是引用者在我们的请求 URL 中不存在。这对诊断问题有任何影响吗? - Hossein Shahsahebi
显示剩余13条评论
2个回答

2

尝试做这个

var myurl = location.origin + decodeURIComponent(location.pathname);

基本上与 location.href 相同,但应该可以工作。


@Hossein Shahsahebi,你有时间检查一下吗? - Emiliano

0

我实际上无法重现这个错误,在我进行的少数测试中,您的代码得到了正确的location.href。

我能想到唯一可能导致这种情况的问题是在构建类时创建链接。

var my_obj = {
     /*...*/
     url: "http://sd.domain.ir/index.php?r=" + Math.floor(Math.random() * (1e8 + 1)) + "0&ref=" + (window.btoa ? btoa(location.href) : "ie") + "&responsive=" + (document.querySelector('meta[name="viewport"][content*="width=device-width"]') ? "yes" : "no") + "&params=",
     /*...*/
}
my_obj.init();

这样做意味着在加载.js文件时实际上填充了url

你得到的肯定是一个引荐者,就像在旧版本的Android浏览器中,在location.href更改之前实际上加载脚本,或者有某种预取(例如浏览器在实际转到下一页之前从下一页加载内容)。

在dom加载后获取location.href应该更好。您可以尝试在获取href之前检查自己处于什么状态:

var my_obj = {
     init: function(){
            my_obj.url =  "http://sd.domain.ir/index.php?r=" +Math.floor(Math.random() * (1e8 + 1)) + "0&ref=" + (window.btoa ? btoa(location.href) : "ie") + "&responsive=" + (document.querySelector('meta[name="viewport"][content*="width=device-width"]') ? "yes" : "no") + "&params=";
     }
     /*...*/,
     url: ""
}

if(document.readyState == "uninitialized" || document.readyState == "loading "  || document.readyState == "loaded"){
    document.onreadystatechange = function(){
        if (document.readyState == "interactive") {
            my_obj.init();
         }
    } 
}else{
   my_obj.init();
}

谢谢您的回复,但问题在于在readystatechange上启动url_show太晚了,无法使用该变量。 - Hossein Shahsahebi
但我更改了代码,使其足够晚地处理此变量。 - Hossein Shahsahebi
1
@HosseinShahsahebi 我本来想问你能否让它在等待readystate从未初始化到加载或已加载时工作。更好的方法是,您可以检查当前状态的init函数,以查看是否应立即创建或等待。 - Kesty
我尝试了你说的情况,但没有成功,谢谢你的帮助。 - Hossein Shahsahebi

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