1

私は単純なフォームを持っています:

@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype="multipart/form-data" }))
{
    <input type="file" name="image" />
    <br />
    <input type="submit" value="Upload" />
}

私が投稿しているもの:

[HttpPost]
public ActionResult Upload(HttpPostedFileBase file)
{
    if (file.ContentLength > 0)
    {
        // All necessary validation logic here
    }

    return RedirectToAction("Index");
}

アップロードするファイルを jpeg、png、および gif 形式に制限しようとしています。アップロードされた画像の幅と高さの最小値と最大値、および画像ファイルサイズを制限したくありません。

ifステートメントを次のように変更するだけでサイズを確認できると思います。

if (file.ContentLength > 0 && file.ContentLength < maxUploadSize)

アップロードされたファイルの拡張子を確認する方法は知っていますが、MIME タイプ/ヘッダーも確認したいと思います。

質問:

上記のサンプル コードの場合、アップロードされたファイルを適切に検証するにはどうすればよいですか? ファイルが次のようになっていることを確認したい:

  • JPEG、GIF、または PNG ファイル (ファイル拡張子とファイル ヘッダーをチェック)
  • 最大アップロード サイズ (ファイル サイズ) 以下
  • 事前定義された制限内の寸法 (幅/高さ)
4

1 に答える 1

1

あなたが言ったように、ファイル拡張子で画像タイプを検証するだけです。リクエストヘッダーは偽造できるため、信頼できません。

アップロード サイズを最大にするには、必要に応じて (アプリ レベルまたはマシン レベル)、web.config または machine.config を更新する必要があります。

IIS6 の場合:

<location path="upload">
  <system.web>
    <httpRuntime maxRequestLength="xxx" />
  </system.web>
</location>

IIS7 の場合: http://support.microsoft.com/kb/942074/

寸法の検証に関しては、画像を読み込んでそのプロパティを確認する必要がwidthあります。これは、メモリ内でそれを行うためheightのコンストラクタビットマップ クラスです。最初に画像をファイルに保存する場合は、これを使用します。

詳細: この値を大きくすると、ここで説明されているように、サービス拒否 (DOS) 攻撃の被害者になる可能性があります。

セキュリティ対策:

  • 現時点で考えられる回避策の 1 つは、ファイルのアップロードを処理する別のサーバー/マシンをセットアップして、メインの Web サーバーがヒットしないようにすることです。
  • <location path="my-upload-path">この設定を 1 つの場所に適用するために使用します。
  • HttpHandler または HttpModuleを使用してアップロードを処理することを検討してください。

それよりも優れた解決策が見つかったら、回答を更新します。

于 2012-05-21T00:28:58.380 に答える