我的目标是在用户默认浏览器中安全地打开网页。该网页的 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# 中是否有更好的方法来做到这一点?
您要检查的是scheme
网址的(即ftp://
, http://
, file://
等)以下是方案列表:http://en.wikipedia.org/wiki/URI_scheme#Official_IANA-registered_schemes 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 并重建它,同时验证每个部分。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)