绕过阻止其URL包含嵌入凭据的子资源请求

时间:2017-07-11 15:55:05

标签: html google-chrome authentication url parameters

我一直在通过URL中的令牌链接自动验证访问我们内部wiki的用户,如下所示:

href="https://user:pass@host/"

在Chrome 59中,这是被阻止的。

[弃用]其网址包含嵌入凭据(例如https://user:pass@host/)的子资源请求被屏蔽。

我读了,我在这样的ajax请求中绕过了它:

how to replace embedded credentials in subresource requests

=============================================== =========================

我的问题是:

有人知道如何直接在链接中执行此操作,还是可以提供某种解决方法?这甚至可能吗?

3 个答案:

答案 0 :(得分:4)

传递命令行选项'--disable-blink-features = BlockCredentialedSubresources'可恢复预期的行为。如果您正在使用Selneium,则可以将其作为浏览器功能中的 args 选项传递,以恢复预期的行为。

PHP:     'chromeOptions'=> array('args'=> [' - disable-blink-features = BlockCredentialedSubresources']);

的Python:     capabilities ['chromeOptions'] = {'args':[' - headless']}

根据Chromium票证(https://bugs.chromium.org/p/chromium/issues/detail?id=731618),尽管处于“弃用”状态,但在将来的版本中可能无法恢复此行为。在这种情况下,最好查看ssh管道以进行测试,或者在可能的情况下将IP列入白名单,以防止HTTP Auth交互。

安东尼

答案 1 :(得分:2)

如果您的网页包含css,javascript或其他具有亲戚("文件夹/文件")或基本相对(" /文件夹/文件")位置的内容,则问题是这些包含的文件将从相对于页面基本URL的URL获取,其中包括user:pass组件。

正是那个用户:传递组件(你可能从来没有暗示暗示......),这使得子资源的URL非法,跟随this change to Chrome

如果这是您的问题,您可以通过向页面添加<base href="https://host/">标记来修复它(即相同的基地址,但没有用户:传递组件)。 (如果您的页面位于子目录中,则还需要在基本href中包含子目录,以便完全相对的URL工作。)

要明确的是,<a href="https://user:pass@host/">Link</a>之类的链接仍然可以使用(只要用户:传递网址在新页面中打开的链接中,并且不是iframe的网址,比如说 - 现在是禁止)。但即使链接有效,我上面描述的问题也适用于新打开页面中相对路径所包含的元素。

<强>更新

这已被接受为bug in Chrome,与禁止用户的新更改直接相关:传递子资源网址。不幸的是,通过该讨论中的链接,似乎提出了一个很可能的解决方案to remove support for user:pass URLs entirely。任何知情评论都会添加到该讨论中,并赞成保留此功能可能会有所帮助。

答案 2 :(得分:1)

要解决这个问题,我们必须传递chrome选项:&#34; - disable-blink-features = BlockCredentialedSubresources&#34;);

完整代码如下:

ChromeOptions options = new ChromeOptions();
        options.addArguments("--start-maximized");
        options.addArguments("--disable-blink-features=BlockCredentialedSubresources");

        Map<String, Object> prefs = new HashMap<String, Object>();
        prefs.put("credentials_enable_service", false);
        prefs.put("profile.password_manager_enabled", false);
        options.setExperimentalOption("prefs", prefs);

        DesiredCapabilities capabilities = DesiredCapabilities.chrome();
        capabilities.setCapability(ChromeOptions.CAPABILITY, options);
        driver = new ChromeDriver(capabilities);