2010-09-20 12 views
5

Mi objetivo es abrir de forma segura una página web en el navegador predeterminado de los usuarios. La URL de esta página web se considera "no confiable" (piénselo como un enlace en un documento abierto con este software, pero el documento podría ser desde cualquier lugar y los enlaces podrían ser maliciosos)Implementación de Safe Process.Start para cadenas URL que no son de confianza

Quiero evitar alguien que pasa "C: \ Windows \ malicious_code.exe" fuera como una dirección URL

mi pensamiento actual es que hacer algo como esto:

Uri url = new Uri(urlString, UriKind.Absolute); 
if(url.Scheme == Uri.UriSchemeHttp || url.Scheme == Uri.UriSchemeHttps) 
{ 
    Process.Start(url.AbsoluteUri); 
} 

me estoy olvidando de nada más que mi 'urlString' podría contener eso lo hace peligroso (por ejemplo, un nuevo personaje de línea que permitiría a alguien colarse un segundo proceso para iniciarse después de la URL o un posible ejecución de un ejecutable relativo comenzando con http)?

Estoy bastante seguro de que ambos casos son manejados por esto (ya que no creo que Process.Start te permita iniciar dos procesos como lo harías en un archivo BATCH y esto solo debería permitir cadenas que comiencen por http: o https: y son URL válidas)

¿Hay alguna forma mejor de hacerlo en C#?

Respuesta

1

Lo que se quiere comprobar es el scheme de la URL (es decir ftp://, http://, file://, etc.) A continuación se presenta una lista de los esquemas: http://en.wikipedia.org/wiki/URI_scheme#Official_IANA-registered_schemes

Para encontrar el esquema de una dirección URL, utilice:

Uri u = new Uri("C:\\Windows"); 
String scheme = (u.GetLeftPart(UriPartial.Scheme).ToString()); 

Para mí, el ejemplo anterior da file://. Simplemente verifique el esquema, usando el código anterior, y rechace los que quiere filtrar. Además, rodee el análisis sintáctico con un bloque try-catch y, si se detecta una excepción, rechace la URL; no se puede analizar, por lo que no debes confiar en él.

Si desea seguridad ultraparanoide, siempre puede analizar la URL mediante un analizador de URL y reconstruirlo, validando cada parte a medida que avanza.

+2

Estoy bastante seguro de que eso es básicamente lo que se implementó en mi pregunta :) – userx

+0

Lo que tienes es bastante sólido. No puedo pensar en nada más que pueda colarse. –

Cuestiones relacionadas