Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 安全进程。启动不受信任URL字符串的实现_C#_Security_Url_Process - Fatal编程技术网

C# 安全进程。启动不受信任URL字符串的实现

C# 安全进程。启动不受信任URL字符串的实现,c#,security,url,process,C#,Security,Url,Process,我的目标是在用户默认浏览器中安全地打开网页。此网页的URL被视为“不受信任”(将其视为使用此软件打开的文档中的链接,但文档可能来自任何地方,其中的链接可能是恶意的) 我希望避免有人将“C:\Windows\恶意代码.exe”作为URL传递出去 我现在的想法是这样做: Uri url = new Uri(urlString, UriKind.Absolute); if( url.Scheme == Uri.UriSchemeHttp || url.Scheme == Uri.UriSchemeHt

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

我希望避免有人将“C:\Windows\恶意代码.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允许您启动两个进程,就像在批处理文件中一样,并且这应该只允许以http:或https:开头的字符串,并且是有效的URL)


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

您要检查的是url的
方案(即
ftp://
http://
文件://
等)。以下是方案列表:

要查找URL的方案,请使用:

Uri u = new Uri("C:\\Windows");
String scheme = (u.GetLeftPart(UriPartial.Scheme).ToString());
对我来说,上面的例子给出了
文件://
。只需使用上面的代码检查方案,并拒绝您想要筛选的方案。另外,用
try catch
块包围解析,如果捕获到异常,则拒绝URL;它无法解析,因此您不应该信任它


如果你想极端偏执安全,你可以使用URL解析器解析URL并重新构建它,在进行过程中验证每个部分。

我很确定这基本上就是我问题中实现的:)你所拥有的非常可靠。我想不出还有什么东西可以偷偷通过。