【问题标题】:Browser.ExecScript() stopped working after updating windowsBrowser.ExecScript() 更新窗口后停止工作
【发布时间】: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

还创建了一个错误报告:

https://connect.microsoft.com/IE/feedback/details/1062093/installation-of-kb3025390-breaks-out-of-process-javascript-execution-in-ie11

更新#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


【解决方案1】:

事实证明,微软最终放弃了在 COM 级别终止 .execScript 的决定。只需安装适用于 Windows 的最新更新,包括 kb3025390:在 kb3025390 恢复 COM 级别的 .execScript 功能之后,IE 的更新之一

但是请注意,.execScript 不再可以通过 IE 的 javascript 访问。在这种情况下,它已经一去不复返了。

【讨论】:

    【解决方案2】:

    仅供参考:这个也不起作用

    ieInstance.Document.Script.<methodNameString>(<commaSeperatedParameterString>)
    

    在某些地方试试这个对我有用但不是所有地方

    ieObject.Navigate "javascript:<methodNameString>(<commaSeperatedParameterString>)", Null, "_parent"
    

    ieObject.Navigate2 "javascript:"<methodNameString>(<commaSeperatedParameterString>)", Null, "_parent"
    

    现在尝试使用 eval 找出解决方案

    【讨论】:

      【解决方案3】:

      我找到了解决自动安装更新问题的方法。您可以创建一个包含以下内容的简单批处理文件。

      {代码} @echo 关闭

      wusa /uninstall /kb:3025390/quiet /norestart

      结束 {代码}

      然后转到任务计划程序,为此批处理文件创建一个新任务,根据您的要求每隔一小时或一天运行一次。将其添加为系统任务,使其在后台运行并且不影响正在运行的自动化。

      【讨论】:

      • 感谢您为此付出的努力。如果可以一次卸载更新然后将其从 Windows 更新中“隐藏”(也就是将其添加到不受欢迎/列入黑名单的更新列表中),那么以同样的精神进行探索会很有趣。我对这种方法的两个担忧是,首先,Windows 更新是否足够聪明,可以自动将依赖于此更新的未来更新列入黑名单;其次,这种躲避的更新链将如何影响客户端计算机中的系统安全。只是我的 2c。
      • 实际上我在组策略下的客户端服务器上使用 Selenium(更新后变得无用)。所以隐藏更新对我没有帮助,每 72 小时安装一次更新。这就是为什么我寻找另一种方法,而不是每 72 小时后卸载它。所以我做了这个简单的调度任务。关于您的疑问,我希望 Internet Explorer 能够解决此问题,因为有很多相关系统因此而崩溃,此特定更新仅适用于 IE,因此不卸载它不会引起任何安全问题
      猜你喜欢
      • 1970-01-01
      • 2020-01-29
      • 2016-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-02
      相关资源
      最近更新 更多