【发布时间】:2014-12-19 13:17:54
【问题描述】:
我为 WatiN(2.1 版)设置了一个简单的测试平台,内容如下:
var browser = new IE();
browser.GoTo("http://www.google.co.il"); // webpage doesn't matter really
browser.RunScript("alert(123)");
这仅在未安装 KB3025390 时有效。安装它会使用 UnAuthorizedAccessException 中断上述测试,该异常将 HRESULT 设置为 E_ACCESSDENIED。是什么赋予了?有什么解决办法吗?
更新:不过,使用 IWebBrowser2.Navigate2 和“javascript:console.log(123)”类型的脚本可以工作
- 使用这样的反向渠道让我感到不安
- 通过 .Navigate2() 的这个反向通道运行的脚本可能只有大约 2070 个字符的最大长度(给予或接受),否则它们会被强制截断到这个长度,从而在尝试执行时导致 javascript 错误运行它们
- 使用 .Navigate2(),即使是最简单的脚本,将永远阻塞 Internet Explorer 的就绪状态,因为它将被设置为 READYSTATE_LOADING,而没有任何摆脱它的希望。简单来说,这意味着一旦你使用了这个 hack,你要么必须以“不要等待网页加载”的方式(GoToNoWait、ClickNoWait 等)在 WatiN 中执行每一个后续操作,以免你的代码冻结等待浏览器返回到 READYSTATE_COMPLETE(如前所述,这当然不会发生)。
- 这里似乎存在一个更广泛的问题,因为我什至无法访问 IHtmlWindow2 对象 p.e. 的属性。 window.document 再次引发未经授权的异常,几乎不可能将我正在运行的脚本的返回值(使用 Expando 等)转移到 C# 世界,而不是 window.top.document(对于 window.top .document 窗口有 IWebBrowser2.Document 可以解决问题)
更新#2:selenium 项目的人们也注意到了这个问题:
https://code.google.com/p/selenium/issues/detail?id=8302
还创建了一个错误报告:
更新#3:IHTMLWindow2.setInterval 和 IHTMLWindow2.setTimeout 也会引发 UnauthorizedAccess 异常。这些方法未标记为已弃用:
http://msdn.microsoft.com/ko-kr/library/windows/desktop/aa741505%28v=vs.85%29.aspx
然而,他们最终还是遭受了同样的削减。
更新#4:我尝试了这篇文章中推荐的方法:
https://stackoverflow.com/a/18546866/863651
为了动态调用 IHTMLWindow2 对象的“eval”方法(或任何其他方法)。得到与上面相同的“System.UnauthorizedAccessException”。所以这里也没有欢乐。
Microsoft 建议使用“eval”而不是“execscript”,但是在上述实验之后,我怀疑他们指的是仅从浏览器中访问“eval”。
据我所知,当涉及到使用“eval”进程外(通过 COM)的成熟 IE11+ 时,似乎已完全禁止与窗口的任何其他函数调用一起使用对象,唯一的例外是上面提到的 .Navigate2() 的反向通道。
【问题讨论】:
-
browser.Eval("alert(123)");呢? -
我也想知道
browser.GoTo("javascript:alert(123)")是否也能正常工作。也许它与警报的调用方式有关? -
.Eval() 以相同的 HRESULT 失败。 .GoTo() 方法似乎至少在微不足道的测试中有效。另一方面:我在 Internet 区域中修改了 IE 的安全设置,但没有任何结果。感谢您对此进行调查。
-
我注意到的另一件事是 WatiN 的 browser.Eval() 本质上会在内部回退到像 browser.ExecScript() 这样使用 window.execScript() ,这就是为什么它在结尾没有区别那天。阅读更新#4,了解如何调用窗口对象的“真实”评估(尽管仍然失败)。
-
我认为您唯一的解决方案是删除破坏此问题的更新。您使用的是哪个版本的 Visual Studio?也许对 VS 的更新可以解决这个问题?
标签: javascript security watin