2011-03-31 26 views
6

Me gustaría abrir un sitio web en el navegador web predeterminado de un usuario; sin embargo, dado que la url está definida por el usuario, también me gustaría evitar que hagan algo más que abrir un sitio web.¿Abre el sitio web en el navegador predeterminado del usuario sin permitir que inicie nada más?

He visto personas usar Process.Start(url); para abrir un sitio en el navegador predeterminado, pero dado que la url está definida por el usuario, quiero asegurarme de que no ingresen algo así como una ubicación de script y lo ejecuten.

Tampoco quiero usar Process.Start("iexplore", url); ya que prefiero abrir el enlace en el navegador predeterminado del usuario.

¿Hay alguna manera de que pueda abrir un sitio web en el navegador predeterminado del usuario, sin permitirles iniciar ningún otro proceso o comando?

EDITAR

Por ejemplo, no quiero que los usuarios puedan entrar en C:\Windows\Notepad.exe en el campo de la página web del cliente y el Bloc de notas abierta cuando hacen clic en el enlace Web

editar # 2

Soy no buscando una manera de filtrar el acceso del usuario en línea o tener este sustituto para la seguridad de la propiedad. Simplemente estoy buscando una forma de evitar que los usuarios inicien cualquier otra aplicación ingresando una URL incorrecta. Si ingresan "google" para el sitio web de un cliente, no deben lanzar un diálogo Abrir con archivo, sino que deben abrir el navegador web predeterminado del usuario con la palabra "google" en la URL

+0

habría dicho incrustar el navegador en su aplicación, pero no será capaz de hacer esto para el navegador * * por defecto, pero solo para un navegador especificado previamente (normalmente IE). –

+1

¿Cómo se define el "usuario" de la URL? ¿Lo ingresan en un cuadro de texto? ¿Puedes explicar el flujo de trabajo [previsto] un poco más? –

+1

Simplemente verifique que comience con "http: //" o "https: //"? – Blorgbeard

Respuesta

6

Puede buscar el navegador predeterminado desde el registro. Está en varios lugares diferentes, pero creo que HKEY_CURRENT_USER\Software\Classes\http\shell\open\command sería un buen lugar para buscar.

Extraiga el nombre del ejecutable de ese, luego Process.Start con la URL ingresada por el usuario como parámetro.

+1

Gracias, de hecho lo conseguí antes de publicar esto :) ¿Sabes si funciona con otros sistemas operativos Windows o si hay alguno? ¿Se necesitan permisos especiales para acceder a esa clave en un entorno de servidor de terminal? – Rachel

+0

Me gustaría ... tentativamente ... esperar que funcione al menos en Win2k y hasta. Y no debería haber problemas de permisos para acceder a HKCU, pero no tengo experiencia con servicios de terminal. Por lo tanto, le aconsejo que lo pruebe cuidadosamente :) – Blorgbeard

1

Creo que puede consultar la url confirme que es una URL válida, no una ruta de un archivo ejecutable.

Puede usar expresiones regulares para validar la url, eche un vistazo aquí here.

¡Buena suerte!

+0

Hay tantos tipos diferentes de URL y aplicaciones que construir una expresión regular para esto sería una pesadilla – Rachel

3

Bueno, realmente no. Lo que podría hacer es verificar si es una URL de HTTP y si la URL devuelve un tipo de contenido text/html, pero ni siquiera eso ayudará si el navegador usa el rastreo de contenido (ignora el tipo de contenido, intenta determinarlo desde el archivo contenido - IIRC IE6 hace esto, no estoy seguro de qué otros).

Además, varios navegadores son susceptibles a varios agujeros de seguridad en las direcciones URL con formato incorrecto (¿por qué IE vienen a la mente otra vez?), Por lo que es posible que desee comprobar si hay casos de piratería nulos, EOL hacks, etc, etc

Al final, no hay una verificación de URL perfecta: los navegadores antiguos/sin actualizar siempre serán susceptibles a algunos exploits, y eso no es algo que puedas solucionar. Sin embargo, puede filtrar la mayoría de ellos, ya sea el 80%, el 99% o el 99,99%, dependiendo de la cantidad de tiempo que esté dispuesto a invertir.

5

he encontrado una manera de hacerlo, sin embargo no he probado para ver si esto va a funcionar en otros sistemas operativos

consigo el camino para el DefaultWebBrowser del registro y luego usar Process.Start(defaultBrowserPath, url);

public static void OpenWebsite(string url) 
{ 
    Process.Start(GetDefaultBrowserPath(), url); 
} 

private static string GetDefaultBrowserPath() 
{ 
    string key = @"http\shell\open\command"; 
    RegistryKey registryKey = 
    Registry.ClassesRoot.OpenSubKey(key, false); 
    return ((string)registryKey.GetValue(null, null)).Split('"')[1]; 
} 
+0

¿Cómo protege eso al usuario? –

+0

Oooooh - Ahora lo entiendo. Le preocupa que las personas inicien un proceso que ** no es ** el navegador, porque han establecido la URL en "C: \ Windows \ Notepad.exe". –

+0

@RB: ¿Qué ocurre cuando "http \ shell \ open \ command" * is * "C: \ Windows \ Notepad.exe"? – Piskvor

2

Si te entiendo bien, entonces no hay solución para el problema que describes. Usted está diciendo: ¿cómo puedo filtrar los datos ingresados ​​por el usuario (con suerte en forma de un Uri, pero incluso un Uri es un concepto muy amplio) para garantizar que no se trate de contenido malicioso. La respuesta es que sin hacerlo manualmente, no puedes.

http://here.dowloadmyvirus.com es un sitio Uri perfectamente válido pero nunca se puede alguna vez garantizar el contenido que se servirá desde allí.

Ni siquiera tiene que ser un Uri: si presionas Inicio/Ejecutar y escribes "iexplore c: \ windows \ notepad.exe", entonces (con IE9 RTM) aparece mi propio notepad.exe local como descarga. No hay nada que le impida señalar un script malicioso alojado en línea.

Le sugiero que necesite limitar el acceso para que solo unos pocos usuarios de confianza puedan editar cualquier información que administre, o tener un proceso de auditoría para garantizar que dicho contenido se valida antes de que se publique .

+0

Los usuarios se encuentran principalmente en Servicios de Terminal Server con algunos permisos estrictos establecidos. No pueden descargar nada en línea, no pueden instalar aplicaciones, hay un filtro de contenido y un firewall que ayudan con la mayoría de los sitios web malos, tienen permisos muy limitados para hacer cualquier cosa. No busco una forma de filtrar el acceso web, estoy buscando una manera de evitar que los usuarios inicien scripts o aplicaciones a través de la URL que pueden ingresar. En resumen, quiero abrir el navegador web predeterminado de los usuarios y pasarle una URL, NO simplemente vaya a 'Process.Start (url);' – Rachel

1

Me parece que te estás preocupando por algo que de hecho no es un problema. Si el usuario puede ejecutar un programa en lugar de una URL de su aplicación, entonces ellos también podrían ejecutar un programa ellos mismos. Es solo un problema de seguridad si acepta la entrada de alguna entidad que no sea el usuario que ha iniciado sesión.

2

He encontrado una manera, que aprovecha el hecho de que javascript se ejecuta en una caja de arena.

Tenga una página web (por ejemplo, http://mydomain/LaunchPage.html) que sea accesible para su aplicación de escritorio. Llámalo poniendo tu URL en la cadena de consulta (así http://mydomain/LaunchPage.html?URL=http://www.google.com).

Todo lo que LaunchPage hace es usar JavaScript para establecer la ubicación del documento.

<script> 
    /* 
    * Retrieve names values from the query string. 
    * Based on an idea from 
    * http://ilovethecode.com/Javascript/Javascript-Tutorials-How_To-Easy/Get_Query_String_Using_Javascript.shtml 
    */ 
    function queryString(key) { 
     args = window.location.search.substring(1).split("&"); 
     for (i = 0; i < args.length; i++) { 
      keyValuePair = args[i].split("="); 
      if (keyValuePair[0].toUpperCase() == key.toUpperCase()) { 
       return keyValuePair[1]; 
      } 
     } 
     return null; 
    } 

    document.Location = queryString("URL"); 
</script> 

Si la URL se establece en un archivo local o algo así, el entorno limitado JavaScript evitará que se use.

Ahora puede usar el siguiente código con total seguridad.

Process.Start("http://mydomain/LaunchPage.html?URL=C:\Windows\Notepad.exe") 

EDITAR Tenga en cuenta que el archivo HTML puede ser instalado al lado de su aplicación. Si usted ha hecho esto, el código para poner en marcha sería algo así como:

Process.Start("c:\<InstallRoot>\LaunchPage.html?URL=C:\Windows\Notepad.exe") 
+0

Gracias, pero esta no es una aplicación web. Alguien retomó mi pregunta original. Es una aplicación de escritorio WPF que usa C# – Rachel

+0

@Rachel Esto también funciona para una aplicación WPF. En lugar de utilizar 'Process.Start (url)' (o la solución que se te ocurra), en su lugar utilizas 'Process.Start (" http: //mydomain/LaunchPage.html? URL = "+ url)'. Por lo tanto, todo lo que necesita es 1 único archivo HTML en su aplicación WPF, ya sea en el sistema de archivos local o sentado en un servidor de archivos central o ejecutándose en un servidor web. No importa. Ver mi edición ... –

Cuestiones relacionadas