我一直在通过URL中的令牌链接自动验证访问我们内部wiki的用户,如下所示:
href="https://user:pass@host/"
在Chrome 59中,这是被阻止的。
[弃用]其网址包含嵌入凭据(例如https://user:pass@host/
)的子资源请求被屏蔽。
我读了,我在这样的ajax请求中绕过了它:
how to replace embedded credentials in subresource requests
=============================================== =========================
我的问题是:
有人知道如何直接在链接中执行此操作,还是可以提供某种解决方法?这甚至可能吗?
答案 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);