允许在URI中为Web API调用提供完整的文件路径
本文关键字:路径 文件 调用 URI 中为 API Web | 更新日期: 2023-09-27 18:07:17
我目前正在使用Web API 2实现'下载文件'。
但是,由于可以下载的文件不存储在数据库中,所以我传入完整的文件路径作为标识参数。
这种方法的问题似乎是filePath包含对URI无效的字符…有人有任何建议来解决这个问题或替代方法吗?
下载文件方法:
[HttpGet]
[Route("Files/{*filePath}")]
public HttpResponseMessage Get([FromUri]string filePath)
{
try
{
var file = new FileInfo(filePath);
byte[] bytes = System.IO.File.ReadAllBytes(filePath);
var result = Request.CreateResponse(HttpStatusCode.OK);
result.Content = new ByteArrayContent(bytes);
result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
result.Content.Headers.ContentDisposition.FileName = file.Name + file.Extension;
return result;
}
catch(Exception ex)
{
return Request.CreateResponse(HttpStatusCode.InternalServerError, ex);
}
}
要求客户端在URI中放置完整路径(即使它被编码为只包含URI的有效字符)意味着您可能在某处发布这些路径…这不是一个好主意,原因如下:
- 安全性-完整路径披露和相关的相对路径遍历
- 。什么是阻止某人在路径传递到一个敏感的文件(例如您的web。配置文件),并可能获得有助于攻击您的系统的信息?
- 可维护性
- 客户端可能维护URI的副本以供重用或分发-如果文件路径改变会发生什么?这里有一些与此主题相关的对话:很酷的uri不会改变
我的建议-你不必把文件本身放在数据库中,但把文件列表放在数据库中,并在URL中使用唯一标识符(例如,可能是一个slug或GUID)。在数据库中查找标识符以发现路径,然后返回该文件。
这确保:
- 没有人可以读取你没有索引和确定是安全下载的文件
- 如果你移动文件,你可以更新数据库和客户端uri不会改变
- 为了回答你最初的问题,你可以很容易地确保唯一标识符仅由URI安全字符 组成
一旦有了数据库,随着时间的推移,您可能还会发现维护数据库中的其他元数据非常有用,例如谁上传了文件,何时,谁下载了文件,以及何时,等等。