2011-08-03 5 views
2

私は戻って画像とともに、直接のリンクを防ぎ、以下のコントローラがあります。この作品MVCでは、どのように呼び出し動作を決定しますか?

public class ImageController : Controller 
{ 
    [HttpGet] 
    public ActionResult Details(string id, string file) 
    { 
     if (null == Request.UrlReferrer || 
      Request.UrlReferrer.Authority != Request.Url.Authority || 
      Request.UrlReferrer.AbsolutePath.ToLower() != Url.Action("Photos", "Home", new { id = id }).ToLower()) 
     { 
      return base.File(Server.MapPath("/Content/images/notfound.jpg")); 
     } 

     // else process and return image 
    } 
} 

が、それはわずかな香りを持っています。私にこれを教えるMVC-ierがありますか?私は当初はControllerContextを期待していましたが、そうではありませんでした。あなたのビューで

@foreach (var item in Model.Items) 
{ 
    <li> 
     <img src='@Url.Action("Details", "Image", new { id = Model.Project, file = item.ThumbnailPath })' /> 
    </li> 
} 
+0

全体のことは、わずかな香りを持っています。これは怒られます。多くのユーザーはRefererを送信しません。私はOperaがデフォルトでRefererを送らないと信じています。 – SLaks

+0

あなたが同意してうれしいです。私の質問のポイントは、3行を1に置き換えるだけでなく、UrlReferrerとそのすべての問題を回避することでした。 –

答えて

1

は、ID +ファイル+日時を含む暗号化された文字列を生成します。私は私の見解から、このアクションを呼び出すのですか。ここ

です。 img src @ Url.Actionでこの暗号化された文字列を渡します。

コントローラで、この文字列を復号化してID &ファイル& datetimeを取得します。 datetimeが15秒より大きい場合は、イメージを提供しないでください。キーが正常に復号化されなかった場合、イメージを提供しないでください。

暗号化ロジックがプライベートなので、他の人がリクエストを偽造できないため、暗号化されたキーにdatetimeがあるため、リンクを10-15秒で期限切れにすることができます。

希望はこれが理にかなっています。

@foreach (var item in Model.Items) {  

<li> 
     <img src='@Url.Action("Details", "Image", new { encryptedString= item.encryptedString})' />  

</li> } 

public class ImageController : Controller 
{  

    [HttpGet]  
    public ActionResult Details(string encryptedString) 
    {   
      try 
      { 

      string[] values = DescryptString(encryptedString); 
      // values[0] = id 
      // values[1] = file 
      // values[2] = datetime 

      if(dateTime difference < 10 seconds) 
       return process and return image ; 
      else // link expired 
       return base.File(Server.MapPath("/Content/images/notfound.jpg"));     
      } 
      catch(DecodingException e) 
      { 
       // forged request 
       return base.File(Server.MapPath("/Content/images/notfound.jpg"));    
      }      

    } 
} 
+0

面白いことを回避します。暗黙の答えは、あなたが呼び出した行動を特定できないことだと思います。 –

関連する問題