【发布时间】: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