在用户的默认浏览器中打开网站,而不让他们启动其他任何东西?

时间:2011-03-31 14:20:08

标签: c# .net desktop-application

我想在用户的默认网络浏览器中打开一个网站,但由于网址是用户自定义的,我还想阻止他们做除打开网站以外的任何事情。

我见过人们使用Process.Start(url);在默认浏览器中打开网站,但由于网址是用户自定义的,我想确保他们不会输入类似脚本位置的内容并执行它。

我也不想使用Process.Start("iexplore", url);,因为我宁愿在用户的默认浏览器中打开该链接。

有没有办法可以在用户的​​默认浏览器中打开网站,而不让他们启动任何其他进程或命令?

修改

例如,我不希望用户能够在客户的网站字段中输入C:\Windows\Notepad.exe并在他们点击网站链接时打开记事本

编辑#2

正在寻找一种方法来过滤用户在线访问或取代财产安全。我只是想找到一种方法来阻止用户通过输入错误的URL来启动任何其他应用程序。如果他们为客户的网站输入“google”,则不应该打开“打开方式”文件对话框,而是启动用户的默认网络浏览器,并在网址中添加“google”一词

7 个答案:

答案 0 :(得分:6)

您可以从注册表中查找默认浏览器。这是在几个不同的地方,但我认为HKEY_CURRENT_USER\Software\Classes\http\shell\open\command将是一个值得关注的好地方。

从中提取可执行文件名称,然后使用用户输入的URL作为参数Process.Start

答案 1 :(得分:5)

我找到了一种方法,但是我没有测试过它是否适用于其他操作系统

我从注册表中获取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];
}

答案 2 :(得分:3)

嗯,不是真的。您可以做的是检查它是否是HTTP(s)URL,以及URL是否返回text/html内容类型 - 但如果浏览器使用内容嗅探(忽略内容类型,尝试从文件内容中确定它 - IIRC IE6做到这一点,不确定其他内容。

此外,各种浏览器容易受到格式错误的URL中的各种安全漏洞的影响(为什么还会再次想到IE?),因此您可能需要检查空黑客,EOL黑客等等。

最后,没有完美的URL检查 - 旧的/未修补的浏览器总是容易受到一些攻击,而这并不是你能解决的问题。但是,您可以过滤掉大部分 - 无论是80%,99%还是99.99%,取决于您愿意投资的时间。

答案 3 :(得分:2)

如果我理解你的话,那么你所描述的问题就无法解决。你说的是:如何过滤用户输入的数据(希望以Uri的形式,但即使是Uri也是一个非常广泛的概念),以确保它不是恶意内容。答案是,如果不手动操作,则不能。

http://here.dowloadmyvirus.com是一个完全有效的网站Uri,但您永远永远不会保证从那里提供的内容。

它甚至不需要是Uri:如果你点击开始/运行并键入“iexplore c:\ windows \ notepad.exe”然后(使用IE9 RTM)我将自己的本地notepad.exe作为下载。没有什么可以阻止你指着在线托管的恶意脚本。

我建议您要么限制访问权限,以便只有少数可信用户可以编辑您正在管理的任何数据,或者制定审计流程以确保此类内容在发布之前得到验证。

答案 4 :(得分:2)

我已经找到了一种方法,它利用了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") 

答案 5 :(得分:1)

我认为您可以检查网址以确认它是有效的网址而不是可执行文件的路径。

您可以使用正则表达式来验证网址,看看here

祝你好运!

答案 6 :(得分:1)

在我看来,你担心的事实上并不是一个问题。如果用户可以运行程序而不是应用程序中的URL,那么他们也可以自己运行程序。如果您接受来自登录用户以外的某个实体的输入,那么这只是一个安全问题。