Laden...

WebBrowser-Control: UnauthorizedAccessException beim Zugriff auf Frame anderer Domain

Erstellt von Ploetzi vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.378 Views
Ploetzi Themenstarter:in
313 Beiträge seit 2006
vor 12 Jahren
Hinweis von herbivore vor 12 Jahren

translate.googleusercontent.com ist nur ein - zugegeben etwas ungünstig gewähltes - Beispiel.

WebBrowser-Control: UnauthorizedAccessException beim Zugriff auf Frame anderer Domain

Hallo,
ich rufe folgende Url auf in einem Webbrowser:


   string url2 = "http://translate.googleusercontent.com/translate_c?hl=en&rurl=translate.google.com&sl=en&tl=de&twu=1&u=http://www.orf.at" 

Im Document Completed bekomme ich bei folgendem Aufruf:


MessageBox.Show("Daten:" + webBrowser1.Document.Window.Frames[1].Document.Body.InnerHtml);

Eine UnAuthorizedAccessException.

Ich will den Sourcecode des unteren Frames auslesen.
Vermutlich ist das ein CrossSkriptingschutz.

Hat jemand eine Idee?

2.891 Beiträge seit 2004
vor 12 Jahren

UnAuthorizedAccessException [...] Vermutlich ist das ein CrossSkriptingschutz.

Und das Ganze gibt's ja nicht ohne Grund:

Zitat von: Google - Nutzungsbedingungen
Sie sind nicht berechtigt, die Dienste in missbräuchlicher Art und Weise zu nutzen, in die Dienste einzugreifen oder auf die Dienste in anderer Weise als über die von Google bereitgestellten Benutzeroberflächen und/oder Schnittstellen zuzugreifen. [...] Es ist Ihnen untersagt, auf die Dienste in automatisierter Weise zuzugreifen, beispielsweise mit Robots oder Skripts.

Also lass das und benutze die API so, wie du sollst/darfst (Google Translate API)

Ploetzi Themenstarter:in
313 Beiträge seit 2006
vor 12 Jahren

Hallo,
das ganze haengt hier nicht mit Google zusammen. Das passiert mir bei saemtlichen Framesets mit verschiedenen Urls

Das oben war nur ein Beispiel. Würde ich das nutzen,würde ich die Google Translator API nutzen. bzw. von Bing, dort gibts gratis access bis zu einer gewissen Anzahl an Requests, aber darum gehts eg bei meiner anfrage gerade nicht.

Grüsse,

L
667 Beiträge seit 2004
vor 12 Jahren

Ich arbeite zwar nicht mit dem .NET Webbrowser Control, aber mit MSHTML und SHDocVW, wobei ich glaube, das .NET Webbrowser Control nutzt intern auch MSHTML bzw. SHDocVW.

Ich bin auf dasselbe Problem gestoßen wie Du - wenn eine Seite Frames mit src aus verschiedenen Domains beinhaltet, ist der Zugriff auf die Frames normalerweise nicht gestattet.

Ich habe aber einen Weg gefunden, das Ganz zu umgehen und zwar so:


public static class CrossDomainHelper
  {
    /// <summary>
    /// Returns the HTMLDocument object hostet by a specified frame element.
    /// If the passed IHTMLWindow2 instance is not a frame or a browser object, an invalid cast exception will be thrown.
    /// </summary>
    /// <param name="frame">IHTMLWindow2 instance wrapping up a HTMLFrameElement or a IHTMLWebBrowser2 instance.</param>
    /// <returns>The document hosted by the specified frame or browser object.</returns>
    public static IHTMLDocument2 GetCrossDomainDocumentFromFrame(IHTMLWindow2 frame)
    {
      int E_ACCESSDENIED = unchecked((int)0x80070005L);
      Guid IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046");
      Guid IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11D0-8A3E-00C04FC9E26E");

      if (frame == null)
        return null;

      //Try if a cross domain conversion is necessary or if security setting don't restrict us from obtaining the frame document via the standard way...
      try
      {
        IHTMLDocument2 doc = frame.document;
        return doc;
      }
      catch (COMException comEx)
      {
        //In case a COMException is fired, check if it was a masked UnauthorizedAccess Exception
        if (comEx.ErrorCode != E_ACCESSDENIED)
        {
          //If it wasn't, some unexpected error occured -> return null in this case.
          return null;
        }
      }
      catch (System.UnauthorizedAccessException)
      {
        //Ignore UnathorizedAccessException, it only signals we have a cross domain access security restriction which we will deal with later.
      }
      catch
      {
        //any other unexpected error -> return null in this case
        return null;
      }

      //Let's deal with the cross domain restriction and retrieve the frame document using a COM service provider...
      try
      {
        // Convert IHTMLWindow2 to IWebBrowser2 using IServiceProvider and return the frame document if the COM extraction worked well.
        IServiceProvider sp = (IServiceProvider)frame;
        Object brws = null;
        sp.QueryService(ref IID_IWebBrowserApp, ref IID_IWebBrowser2, out brws);
        SHDocVw.IWebBrowser2 browser = (SHDocVw.IWebBrowser2)(brws);

        return (IHTMLDocument2)browser.Document;
      }
      catch
      {
        //If for whatever reason the COM extraction doesn't work, return null...
        return null;
      }

      return null;
    }
  }
  
  /// <summary>
  /// COM service provider marshalling...
  /// </summary>
  [ComImport(), ComVisible(true), Guid("6D5140C1-7436-11CE-8034-00AA006009FA"),
  InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
  public interface IServiceProvider
  {
    [return: MarshalAs(UnmanagedType.I4)]
    [PreserveSig]
    int QueryService(ref Guid guidService, ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppvObject);
  }

Wie Du das jetzt genau auf das .NET Webbrowser Control übertragen kannst, weiß ich nicht - dazu hab ich es mir nicht lange genug angeschaut. Für meinen Zweck reicht die Funktionalität des .NET Controls nicht aus, weswegen ich dann bei den SHDocVW / MSHTML COM-Komponenten gelandet bin.

"It is not wise to be wise" - Sun Tzu

Ploetzi Themenstarter:in
313 Beiträge seit 2006
vor 12 Jahren

Vielen Dank!