descargar .net browser download

.net - descargar - uc browser



¿Cómo bloquear las descargas en el control.NET WebBrowser? (3)

Puede usar el evento Navigating que permite la cancelación.

Dentro de este evento, puede tratar de conectarse a la URL que se está navegando usted mismo, inspeccionar los encabezados de respuesta http y cancelar la navegación si se detecta ContentType inapropiado.

System.Net.WebRequest request = System.Net.WebRequest.Create(e.Url); // we need only header part of http response request.Method = "HEAD"; System.Net.WebResponse response = request.GetResponse(); // only text/html, text/xml, text/plain are allowed... extend as required if (!response.ContentType.StartsWith("text/")) { e.Cancel = true; MessageBox.Show("Not allowed for security resons..."); }

Obviamente, esto no es una solución a prueba de balas, pero puede darte una idea de cómo comenzar (si no te importa el viaje de ida y vuelta para recuperar encabezados de respuesta http).

Jens Bannmann escribió:

Esto no es ideal, ya que estoy tratando con aplicaciones web donde la solicitud adicional podría desencadenar una acción que se llevaría a cabo dos veces :-(

Luego, crearía un servidor proxy simple que inspeccionaría todos los datos recibidos y filtraría todas las respuestas http que podrían desencadenar el diálogo "Guardar como" en el control de su navegador web.

Simplemente, no permita que su control de navegador web acceda directamente a Internet, pero delegue todas las solicitudes http a su servidor proxy especial que filtrará todas las respuestas inseguras de la web.

Necesito evitar que el control .NET WebBrowser muestre "¿Desea abrir o guardar este archivo?" y los diálogos "Guardar como". En cambio, quiero mostrar un cuadro de mensaje que le diga a los usuarios que las descargas de archivos están deshabilitadas por razones de seguridad.

Comencé con el evento FileDownload de WebBrowser , pero no permite la cancelación. Luego, utilicé el enfoque de CodeProject: Extended .NET 2.0 WebBrowser Control para implementar mi propio evento basado en la llamada COM original utilizando la interfaz DWebBrowserEvents2 . Cuando arreglé el código de acuerdo con una entrada de la base de conocimiento de MS sobre un error con la firma FileDownload , se llamó al controlador de eventos y pude cancelar la descarga.

Sin embargo, esto no funciona con todas las descargas: las URL de descarga que apuntan a una URL que incluye .exe generan el evento y pueden cancelarse antes de que aparezca el diálogo, pero para otras (como .do ), el controlador de eventos no se llama hasta que el usuario haga clic. Open , Save o Cancel en el cuadro de diálogo.

Una posible solución podría ser interceptar los mensajes de WH_CALLWNDPROCRET y ''responder'' al diálogo antes de que se muestre al usuario , pero parece mucho esfuerzo y también preferiría una solución más limpia ...

¿Alguien sabe cómo bloquear de manera confiable todas las descargas?



La única forma confiable parece ser conectar la cola de eventos de Windows y suprimir los cuadros de diálogo (ya que todo tipo de cosas pueden hacer que el usuario acceda). Esto es lo que hace nuestra clase de ayuda:

void ListenForDialogCreation() { // Listen for name change changes across all processes/threads on current desktop... _WinEventHook = WinAPI.SetWinEventHook(WinAPI.EVENT_OBJECT_CREATE, procDelegate); } void StopListeningForDialogCreation() { WinAPI.UnhookWinEvent(_WinEventHook); } void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime) { const uint OBJID_WINDOW = 0; const uint CHILDID_SELF = 0; // filter out non-HWND, and things not children of the current application if (idObject != OBJID_WINDOW || idChild != CHILDID_SELF) return; //Get the window class name StringBuilder ClassName = new StringBuilder(100); WinAPI.GetClassName(hwnd, ClassName, ClassName.Capacity); // Send close message to any dialog if (ClassName.ToString() == "#32770") { WinAPI.SendMessage(hwnd, WinAPI.WM.CLOSE, IntPtr.Zero, IntPtr.Zero); if (OnDialogCancelled != null) OnDialogCancelled(); } if (ClassName.ToString() == "#32768") { WinAPI.SendMessage(hwnd, WinAPI.WM.CLOSE, IntPtr.Zero, IntPtr.Zero); if (OnDialogCancelled != null) OnDialogCancelled(); } } public delegate void OnDialogCancelledEvent(); public event OnDialogCancelledEvent OnDialogCancelled;

  • # 32770 es la clase Dialog
  • # 32768 es el menú emergente
  • el espacio de nombres de WinAPI son nuestras envolturas de pinvoke.

Si no quiere bloquear todos los cuadros de diálogo, querrá agregar algunos filtros adicionales una vez que haya atrapado la clase. Depende de qué tan seguro debe estar. En $ WORK necesitamos bloquear todas las cargas y descargas.

Suprimir el menú emergente es necesario ya que da acceso a la aplicación de Ayuda, que ofrece enlaces al sitio web de Microsoft, que permite lanzar una instancia completa de IE. Entonces pueden hacer lo que quieran.