【问题标题】:Safe Process.Start implementation for untrusted URL stringsSafe Process.Start 实现不受信任的 URL 字符串
【发布时间】:2011-04-14 11:10:07
【问题描述】:

我的目标是在用户默认浏览器中安全地打开网页。此网页的 URL 被视为“不受信任”(将其视为使用此软件打开的文档中的链接,但该文档可能来自任何地方,并且其中的链接可能是恶意的)

我想避免有人将“C:\Windows\malicious_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:并且是有效的网址)

在 C# 中有没有更好的方法来做到这一点?

【问题讨论】:

    标签: c# security url process


    【解决方案1】:

    你要检查的是url的scheme(即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 并重新构建它,同时验证每个部分。

    【讨论】:

    • 我很确定这基本上是在我的问题中实现的 :)
    • 你所拥有的非常可靠。我想不出还有什么可以偷偷溜进去的。
    猜你喜欢
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2012-08-19
    • 2011-01-24
    • 2011-01-20
    • 1970-01-01
    • 2021-02-07
    相关资源
    最近更新 更多