【问题标题】:ASP.NET WebApi - reference file on server securelyASP.NET WebApi - 服务器上的安全参考文件
【发布时间】:2016-11-24 18:12:22
【问题描述】:

好的,所以我想创建一个缩略图存储,其中包含几个 png 图像文件。

我在服务器端创建了一个目录。现在在我的控制器中,我想处理图像请求。

目前我的控制器代码如下:

public class ThumbnailController : ApiController
{
    [Route("api/v1/thumbnail")]
    [HttpGet]
    public HttpResponseMessage GetThumbnail(string id)
    {
        var result = new HttpResponseMessage(HttpStatusCode.OK);

        string filePath = $@"D:\server_data\Images\Thumbnails\{id}.png";
        if (string.IsNullOrEmpty(filePath) || !File.Exists(filePath)) return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Invalid file");

        var image = Image.FromFile(filePath);
        using (var memoryStream = new MemoryStream())
        {
            image.Save(memoryStream, ImageFormat.Jpeg);
            result.Content = new ByteArrayContent(memoryStream.ToArray());
        }

        result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
        return result;
    }
}

现在这个有一个安全问题:如果我调用类似http://my.address.com/api/v1/thumbnail?id=../securefile.png 的东西,我基本上会得到位于父目录中的securefile.png 图像文件。同样,我可以在硬盘上下载任何 png 图像,这显然是不希望的。

由于某种原因,缩略图目录必须与服务器根目录分离,所以我想我不能使用像 string filePath = HostingEnvironment.MapPath($"~/Images/{id}.png"); 这样的东西

为了避免这个问题,我可以修剪起始点或检查传入的id 是否有特殊字符,但感觉这不是解决问题的正确方法。我想知道是否存在更好的做法。

【问题讨论】:

    标签: c# asp.net security asp.net-web-api


    【解决方案1】:

    修剪起始点是不够的,考虑类似于foo/bar/../../../outside.png的输入。

    您应该验证id 参数只包含说字母,或者更好的是,只包含数字。可以通过validation attributesmodel validation实现复杂的验证,两者基本相同。关键是用户不能输入任何特殊字符,这将有效缓解路径注入威胁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      • 2017-02-09
      • 2019-12-12
      • 1970-01-01
      相关资源
      最近更新 更多