C# webclient下载数据安全漏洞?

C# webclient下载数据安全漏洞?,c#,webclient,C#,Webclient,请看以下代码: public static void Main() { try { WebClient client = new WebClient(); byte[] data = client.DownloadData("http://website../../../page/1/2021-02/28/01/2021022801_brief.jpg"); Console.WriteLine("dat

请看以下代码:

public static void Main()
{
    try
    {
        WebClient client = new WebClient();
        byte[] data = client.DownloadData("http://website../../../page/1/2021-02/28/01/2021022801_brief.jpg");
        Console.WriteLine("data: " + data.Length);
    }
    catch(Exception exc)
    {
        Console.WriteLine(exc);
    }
}
在.NET fiddle上运行它(例如),您将得到以下异常:

System.Net.WebException:找不到路径“C:\Resources\directory\2849EBBA630718392168CA985D98463.DotNetFiddle.Web.LocalResources\Sandbox\67be885b-8fe4-40d0-b80e-cc2cfcbebfbe\page\1\2021-02\28\01\2021022801_-brief.jpg”的一部分。-->System.Net.WebException:找不到路径“C:\Resources\directory\2849EBBA630718392168CA985D98463.DotnetFIDLE.Web.LocalResources\Sandbox\67be885b-8fe4-40d0-b80e-cc2cfcbebfbe\page\1\2021-02\28\01\2021022801_-brief.jpg”的一部分。-->System.IO.DirectoryNotFoundException:找不到路径“C:\Resources\directory\2849EBBA630718392168CA985D98463.DotnetFIDLE.Web.LocalResources\Sandbox\67be885b-8fe4-40d0-b80e-cc2cfcbebfbe\page\1\2021-02\28\01\2021022801_-brief.jpg”的一部分。
在System.IO.\uuu Error.WinIOError(Int32 errorCode,字符串maybeFullPath)
在System.IO.FileStream.Init(字符串路径、文件模式、文件访问权限、Int32权限、布尔用户权限、文件共享、Int32缓冲大小、文件选项选项、安全属性secAttrs、字符串msgPath、布尔bFromProxy、布尔useLongPath、布尔checkHost)
位于System.IO.FileStream..ctor(字符串路径、文件模式、文件访问权限、文件共享、Int32 bufferSize、文件选项选项、字符串msgPath、布尔bFromProxy)
位于System.Net.FileWebStream..ctor(FileWebRequest请求、字符串路径、FileMode模式、FileAccess访问、FileShare共享、Int32长度、布尔异步)
在System.Net.FileWebResponse..ctor(FileWebRequest请求、Uri、FileAccess访问、布尔异步提示)
---内部异常堆栈跟踪的结束---
在System.Net.FileWebResponse..ctor(FileWebRequest请求、Uri、FileAccess访问、布尔异步提示)
位于System.Net.FileWebRequest.GetResponseCallback(对象状态)
---内部异常堆栈跟踪的结束---
位于System.Net.WebClient.DownloadDataInternal(Uri地址、WebRequest和request)
位于System.Net.WebClient.DownloadData(Uri地址)
位于System.Net.WebClient.DownloadData(字符串地址)
在d:\Windows\Temp\vbu5djxg.0.cs中的Program.Main()处:第13行
看到本地服务器路径了吗?!这怎么可能?URI以http开头,为什么.NET尝试在本地查找文件


此外,如果URL由用户输入,他们可以访问服务器文件夹信息。。。这不是一个安全漏洞吗?

http://website../../../page/1/2021-02/28/01/2021022801_brief.jpg
不是有效的URI。获取字符串的重载最终调用具有以下代码位的,以将字符串转换为URI:

    if (!Uri.TryCreate(path, UriKind.Absolute, out uri))
        return new Uri(Path.GetFullPath(path));
调用
Uri.TryCreate
将失败,因为
网站..
的FQDN无效。由于失败,它返回到
Path.GetFullPath

从这里开始,您将进入向后兼容工作和假设的深层通道,这些工作和假设将字符串视为
/
分隔字符串和有效路径,并将其附加到当前工作目录。然后它会冒泡成为
文件://
URI,当本地文件无法打开时,它会失败,出现您看到的错误


如果您在接受用户输入URI的场景中,我建议您使用
URI.TryCreate
UriKind.Absolute
自己构建URI,并验证该类型是您支持的类型之一(通常只是HTTP和HTTPS)。您应该将任何其他内容视为错误并绕过一些辅助层。

这由服务器端决定。在真正的web服务器上运行它,你不应该看到我在我的服务器上也看到了,我只是在.NET fiddle上试了试,看看它是否相同。。。。