2016-11-24 3 views
0

申し訳ありません。そこで、いくつかのpngイメージファイルを含むサムネイルストレージを作成したいと考えています。ASP.NET WebApi - サーバー上の参照ファイル

私はサーバー側にディレクトリを作成しました。今私のコントローラでは、画像のリクエストを処理したいと思います。

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

     string filePath = [email protected]"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; 
    } 
} 

今、この1つはセキュリティ上の問題があります:私はhttp://my.address.com/api/v1/thumbnail?id=../securefile.pngのようなものを呼び出す場合、私は基本的に、親ディレクトリにあるsecurefile.png画像ファイルになるだろう

現在、私のコントローラのコードは次のようになります。同様に、私はハードドライブ上の任意のpngイメージをダウンロードすることができましたが、これは明らかに望ましくありません。サムネイルディレクトリがサーバのルートから切り離されなければならない理由

ので、私は、私はドットを開始トリムや特殊文字の着信idをチェックすることができ、問題を回避するためにstring filePath = HostingEnvironment.MapPath($"~/Images/{id}.png");

のようなものを使用することはできません推測し、それはそれを戦う正しい方法のように感じることはありません。より良い実践が存在するのだろうかと思う。

答えて

1

トリミング開始ドットでは不十分です。入力はfoo/bar/../../../outside.pngと似ています。

idパラメータは、発言のみ、またはそれ以上のもののみを含むように検証する必要があります。 validation attributesまたはmodel validationによって複雑な検証を行うことができます。どちらも基本的に同じです。ポイントは、ユーザーが特殊文字を入力できないようにして、パスインジェクションの脅威を効果的に緩和することです。

関連する問題