Safe Process.Start实现不受信任的URL字符串

use*_*erx 5 c# security url process

我的目标是在用户默认浏览器中安全地打开网页.此网页的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);
}
Run Code Online (Sandbox Code Playgroud)

我忘了我的'urlString'可能包含的任何其他东西,这使得这很危险(例如,一个新的行字符,允许有人潜入第二个进程在URL之后启动或可能执行以http开头的相对可执行文件)?

我很确定这两种情况都由此处理(因为我不相信Process.Start允许你像在BATCH文件中那样启动两个进程,这应该只允许以http:或https:开头的字符串.是有效的网址)

在C#中有更好的方法吗?

Chr*_*nte 1

您要检查的是schemeurl 的(即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());
Run Code Online (Sandbox Code Playgroud)

对我来说,上面的例子给出了file://. 只需使用上面的代码检查方案,然后拒绝您要过滤的方案。另外,用一个块包围解析try-catch,如果捕获到异常,则拒绝该 URL;它无法被解析,所以你不应该相信它。

如果您想要绝对安全,您始终可以使用 URL 解析器解析 URL 并重建它,同时验证每个部分。

  • 我很确定这基本上就是我的问题中所实现的:) (3认同)