使用 Android ActionView 意图打开时,Javascript 重定向在 Edge 浏览器中不起作用,但在手动重新加载后起作用

Jos*_*ost 5 javascript android android-intent microsoft-edge

情况

在我们的 Android 应用程序 (Xamarin) 中,我们使用 ActionView 意图打开一个网页。代码如下所示:

Intent intent = new Intent((string)Intent.ActionView, Android.Net.Uri.Parse(args.url));           
           
intent.AddFlags(ActivityFlags.NewTask);
Run Code Online (Sandbox Code Playgroud)

打开的页面在某个时刻会进行 JS 重定向,其中一行如下:

window.location = '...';
Run Code Online (Sandbox Code Playgroud)

我们尝试了该系列的许多不同变体,包括window.location.href = '...'window.location.assign('...');以及更多。所有人都表现出相同的行为。

问题

多年来,这在所有浏览器中都运行良好 - 但现在我们遇到了一个问题,当 Android 设备上的浏览器是 Edge 浏览器时:

当浏览器选项卡最初通过意图打开时,window.location = '...'浏览器将忽略 Javascript 中的行。没有错误消息 - 只是被忽略。

但是,如果手动打开具有完全相同 URL 的同一浏览器选项卡(通过重新加载或通过复制并粘贴 URL),则 JS 重定向可以正常执行。

问题

我们如何解决这个问题,如何使 JS 重定向可靠地工作?

我的猜测是,我们遇到了一个安全功能,该功能会阻止用户从未与之交互过的浏览器选项卡中的 JS 重定向。

有什么东西(也许是意图标志?)来规避这个问题吗?我们已经尝试过 flag GrantWriteUriPermission,但没有帮助。

可能重复

Android 浏览器 Facebook 重定向并不总是触发 URL 意图
建议的在链接上设置 URL 并伪造点击的情况不起作用。

Pau*_*Crp 0

微软边缘安全

Microsoft Edge 最近修复了有关(2021 年 6 月 24 日)的问题XSS Targeting Non-Script Elements

该漏洞是由两名研究人员在通过 Microsoft Edge 浏览器访问另一种语言的网站并尝试翻译该页面时发现的。Microsoft 最近修复的目标是避免与从第三方应用程序动态访问内容有关的漏洞,特别是在浏览器重定向的情况下。他们需要迅速采取行动,因为漏洞相当巨大。

为了缓解一大类潜在的跨站点脚本问题,Microsoft Edge 扩展系统纳入了内容安全策略 ( CSP )的一般概念

好吧,但是……有什么解决办法吗?

也许您可以在这里找到解决您的问题的解决方案,特别是有关<button onclick="...">.

内联代码在 CSP 的概念中被认为是有害的,微软推荐了一些好的做法:

1 - clickHandler 定义必须移至外部 JavaScript 中

2 - 内联事件处理程序定义必须根据 addEventListener 重写并提取到外部 js 文件中。如果您当前正在使用类似 的代码启动程序<body onload="main();">,请考虑通过挂钩文档的 DOMContentLoaded 事件或窗口的 load 事件来替换它,具体取决于您的要求。使用前者,因为它通常触发得更快。

3 - 函数内部onclick调用必须重写,以避免将函数字符串转换为 JavaScript 运行。

文档中引用的外部 .js 文件的代码示例如下所示:

function awesome() {
// Do something awesome!
}

function totallyAwesome() {
// do something TOTALLY awesome!
}

function awesomeTask() {
    awesome();
    totallyAwesome();
}

function clickHandler(e) {
    setTimeout(awesomeTask, 1000);
}

function main() {
    // Initialization work goes here.
}

// Add event listeners once the DOM has fully loaded by listening for the
// `DOMContentLoaded` event on the document, and adding your listeners to
// specific elements when it triggers.
document.addEventListener('DOMContentLoaded', function () {
    document.querySelector('button').addEventListener('click', 
clickHandler);
    main();
});
Run Code Online (Sandbox Code Playgroud)

希望有帮助