Безопасная реализация Process.Start для ненадежных строк URL - PullRequest
5 голосов
/ 20 сентября 2010

Моя цель - безопасно открыть веб-страницу в браузере пользователя по умолчанию. URL-адрес этой веб-страницы считается «ненадежным» (его можно рассматривать как ссылку в документе, открытом с помощью этого программного обеспечения, но документ может быть откуда угодно, а ссылки в нем могут быть вредоносными)

Я хочу, чтобы кто-то не выдавал "C: \ Windows \ malware_code.exe" как URL

Моя текущая мысль - сделать что-то вроде этого:

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

Я забыл обо всем, что может содержать моя urlString, что делает это опасным (например, символ новой строки, который позволил бы кому-нибудь проникнуть во второй процесс после URL или возможного выполнения относительного исполняемого файла) начиная с http)?

Я почти уверен, что оба этих случая обрабатываются этим (поскольку я не верю, что Process.Start позволяет вам запускать два процесса, как в файле BATCH, и это должно разрешать только строки, начинающиеся с http: или https: и действительные URL)

Есть ли лучший способ сделать это в C #?

1 Ответ

1 голос
/ 20 сентября 2010

То, что вы хотите проверить, это scheme URL (т.е. ftp://, http://, file:// и т. Д.). Вот список схем: http://en.wikipedia.org/wiki/URI_scheme#Official_IANA-registered_schemes

Чтобы найти схему URL, используйте:

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

Для меня приведенный выше пример дает file://. Просто проверьте схему, используя приведенный выше код, и отклоните те, которые вы хотите отфильтровать. Кроме того, окружите синтаксический анализ блоком try-catch и, если исключение обнаружено, отклоните URL; это не может быть проанализировано, поэтому вы не должны доверять ему.

Если вы хотите быть ультра-параноидально безопасным, вы всегда можете проанализировать URL-адрес с помощью анализатора URL-адресов и восстановить его, проверяя каждую часть по мере продвижения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...