Открыть веб-сайт в браузере пользователя по умолчанию, не позволяя ему запускать что-либо еще? - PullRequest
6 голосов
/ 31 марта 2011

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

Я видел, как люди используют Process.Start(url);, чтобы открыть сайт в браузере по умолчанию, но, поскольку URL-адрес определяется пользователем, я хочу убедиться, что они не вводят что-то вроде местоположения скрипта и не выполняют его.

Я также не хочу использовать Process.Start("iexplore", url);, так как лучше открыть ссылку в браузере пользователя по умолчанию.

Есть ли способ открыть веб-сайт в браузере пользователя по умолчанию, не позволяя ему запустить какой-либо другой процесс или команду?

EDIT

Например, я не хочу, чтобы пользователи могли вводить C:\Windows\Notepad.exe в поле Веб-сайт Клиента и открывать Блокнот, когда они нажимают на ссылку Веб-сайт

РЕДАКТИРОВАТЬ # 2

Я не ищу способ фильтрации доступа пользователя в Интернете или заменил его на безопасность имущества. Я просто ищу способ запретить пользователям запускать любое другое приложение, введя неверный URL. Если они вводят «google» для веб-сайта клиента, ему не следует открывать диалоговое окно «Открыть с помощью файла», а вместо этого запускать веб-браузер пользователя по умолчанию со словом «google» в URL-адресе

Ответы [ 7 ]

6 голосов
/ 31 марта 2011

Вы можете найти браузер по умолчанию из реестра. Это в нескольких разных местах, но я думаю, что HKEY_CURRENT_USER\Software\Classes\http\shell\open\command было бы хорошим местом для поиска.

Извлеките из этого имя исполняемого файла, затем Process.Start, указав введенный пользователем URL в качестве параметра.

5 голосов
/ 31 марта 2011

Я нашел способ сделать это, однако я не проверял, будет ли это работать на других операционных системах

Я получаю Путь для DefaultWebBrowser из реестра и затем использую 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];
}
3 голосов
/ 31 марта 2011

Ну, не совсем.Что вы можете сделать, это проверить, является ли URL-адрес HTTP (s), и возвращает ли URL-адрес text/html тип контента - но даже это не поможет, если браузер использует анализатор содержимого (игнорирует тип содержимого, пытается определить его)из содержимого файла - IIRC IE6 делает это, не зная, что другие).

Кроме того, различные браузеры подвержены различным дырам в безопасности в некорректных URL-адресах (почему IE снова приходит на ум?), так что вы можете захотетьпроверять такие вещи, как нулевые хаки, EOL-хаки и т.д. и т.п.,Однако вы можете отфильтровать большинство из них - будь то 80%, 99% или 99,99%, в зависимости от того, сколько времени вы готовы инвестировать.

2 голосов
/ 31 марта 2011

Я разработал способ, который использует тот факт, что javascript работает в песочнице.

Иметь веб-страницу (например, http://mydomain/LaunchPage.html), которая доступна для вашего настольного приложения. Чтобы вызвать ее, укажите свой URL в строке запроса (например, http://mydomain/LaunchPage.html?URL=http://www.google.com).

Все, что делает LaunchPage, это использует JavaScript для установки document.location.

<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>

Если для URL задан локальный файл или что-то еще, то песочница JavaScript не позволит его использовать.

Теперь вы можете использовать следующий код в полной безопасности.

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

РЕДАКТИРОВАТЬ Обратите внимание, что файл HTML может быть установлен вместе с вашим приложением. Если вы сделали это, код для запуска будет выглядеть примерно так:

Process.Start("c:\<InstallRoot>\LaunchPage.html?URL=C:\Windows\Notepad.exe") 
2 голосов
/ 31 марта 2011

Если я вас правильно понимаю, то нет решения проблемы, которую вы описываете. Вы говорите: как я могу фильтровать введенные пользователем данные (, мы надеемся, в форме Uri, но даже Uri - это очень широкое понятие), чтобы гарантировать, что это не вредоносный контент. Ответ в том, что, не делая это вручную, вы не сможете.

http://here.dowloadmyvirus.com - это совершенно действительный сайт Uri, но вы никогда не сможете когда-либо гарантировать содержание, которое будет обслуживаться оттуда.

Это даже не должен быть Uri: если вы нажмете «Пуск / Выполнить» и наберете «iexplore c: \ windows \ notepad.exe», то (с IE9 RTM) я получу свой собственный локальный notepad.exe, запущенный для загрузки. Ничто не мешает вам указывать на вредоносный скрипт, размещенный в Интернете.

Я бы посоветовал вам либо ограничить доступ, чтобы только несколько доверенных пользователей могли редактировать любые данные, которыми вы управляете, либо внедрить процесс аудита, чтобы убедиться, что такой контент проверен перед его публикацией.

1 голос
/ 31 марта 2011

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

1 голос
/ 31 марта 2011

Я думаю, что вы можете проверить URL, чтобы убедиться, что это действительный URL, а не путь к исполняемому файлу.

Вы можете использовать регулярные выражения для проверки URL, посмотрите здесь здесь .

Удачи!

...