2011-07-26 7 views
0

イメージハンドラとしてコントローラを使用しようとしていますが、そのパスをどのように渡しますか?Mvc 3 - イメージハンドラとしてのコントローラ、パスを渡す方法は?

今のところは、この(パスなしの画像のために働く)のようになります。

public void GetImage(string parameter) 
{ 
    var imageHandler = UnityGlobalContainer.Container.Resolve<IImageHandler>(); 
    imageHandler.ProcessRequest(parameter); 
} 

しかし、私はのfolder1 \フォルダ2 \ FOLDER3 \ picture.jpgパスに送信しようとした場合、それは失敗します。 http://localhost:58359/Utility/GetImage/folder1%5Cfolder2%5Cfolder3%5Cpicture.jpg

、それはにつながる::

@Html.ActionLink("Show", "GetImage", "Utility", new { parameter = @"folder1\folder2\folder3\picture.jpg" }, new { }) 

はこれを生産する HTTPエラー400 - 不正な要求。

通常のmvcアプローチを使用してコントローラへのパスをどのように渡すことができますか? (私はバックスラッシュを使用していますが、スラッシュは使用しません) また、パラメータでHttpUtility.UrlEncodeを使用してテストしました。

答えて

2

:HTMLページ内の生産のリンクは次のようになります。 http://localhost:58359/Utility/GetImage?parameter=folder1%5Cfolder2%5Cfolder3%5Cpicture.jpg とパラメータ変数が正しくアクションメソッドで「folder1の\フォルダ2 \ FOLDER3 \ picture.jpg」に設定する必要があります。

directory traversalの脆弱性があることに注意してください。

+0

これはmvcの経路指定とは関係がありませんか? – Patrick

+0

申し訳ありませんがmvcのパスを意味するものを取得しないでください。ビューで生成されたURLをレンダリングされたページのhtmlソース(ビューのhtmlソース)と変数 "parameter"の値をコントローラメソッドに追加できますか(そこにブレークポイントを設定するだけです)?また、GetImageアクションのための特別なルートがありますか? – nakhli

0

.NET 4.0ベータ2では、CLRチームが回避策を提案しました。

web.configファイルにこれを追加します。

<uri> 
    <schemeSettings> 
     <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes" /> 
    </schemeSettings> 
</uri> 

これは、スラッシュはエスケープされずにパスにエスケープするために可能、ウリクラスはURIを記述するRFCに従って動作するようになります。 CLRチームは、セキュリティ上の理由から仕様を逸脱していると報告しています。このファイルを.configファイルに設定すると、基本的に、スラッシュをエスケープしないというセキュリティ上の考慮事項の所有権を取得できます。あなたのコードによると

0

パラメータをデコードするだけでいいですか?代わりに、ファイル名パラメータ「parameter」を呼び出して、あなたのルートでそれを定義する

http://msdn.microsoft.com/en-us/library/6196h3wt.aspx

+0

URLはコントローラを起動さえしません。私は私が得ていない何かをデコードすることはできません= / – Patrick

0

、「ファイル名」それを呼び出すと、あなたのルートでそれを定義しないでください。

アクションコードは同じですが、ファイル名はルートの一部ではなくなり、通常のURLパラメータになります。

URLパラメータが嫌な今シーズンのファッションに悩まされている場合は、この不愉快なことがあるかもしれませんが、これはファッションだけであり、無視しても差し支えありません。

個人的には、間違ってトラバーサル脅威を作成することに全く変態的になるため、私はこのようなパスをWebアプリケーションに渡しません。パスフリーのファイル名を渡し、リストに対して検証してからフェッチしますファイル。

関連する問題