我的目标是在用户默认浏览器中安全地打开网页。此网页的URL被视为“不受信任”(将其视为使用此软件打开的文档中的链接,但文档可能来自任何地方,其中的链接可能是恶意的)
我想避免有人将“C:\ Windows \ malicious_code.exe”作为网址传输
我目前的想法是做这样的事情:
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#中有更好的方法吗?
答案 0 :(得分:1)
您要检查的是网址的scheme
(即ftp://
,http://
,file://
等。)以下是方案列表:{{ 3}}
要查找网址的方案,请使用:
Uri u = new Uri("C:\\Windows");
String scheme = (u.GetLeftPart(UriPartial.Scheme).ToString());
对我来说,上面的例子给出了file://
。只需使用上面的代码检查方案,并拒绝您要过滤的方案。此外,使用try-catch
块围绕解析,如果捕获到异常,则拒绝URL;它无法解析,所以你不应该相信它。
如果你想要超偏执,你总是可以使用URL解析器解析URL并重新构建它,在你进行验证时验证每个部分。