0

これの安全性が気になります。最大サイズが 64 KB の gif 画像のみを許可したい。accept 属性を使用しても安全ですか? すなわちaccept="image/gif"

非常に小さなphp:

if (isset($_REQUEST['upload'])) {
move_uploaded_file($_FILES['file']['tmp_name'], '../images/logos/'.str_replace(" ", "_", $name).'.gif');
}

私のフォームは次のようになります。

<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="65536">
<input type="file" name="file" size="40" accept="image/gif">
</form>

accept属性を使用しても安全ですか?

4

2 に答える 2

2

クライアント側でページコードを変更し、必要なものをサーバーに送信できるため、絶対にそうではありません。これはファイルサイズにも当てはまります。ファイル サーバー側を検証し、その MIME コンテンツ タイプをチェックする必要があります。できればgetimagesize()関数でそれを行うことができます。

サーバー側コードの改善:

if (isset($_REQUEST['upload'])) { 
    list(,, $image_type) = @getimagesize($_FILES['file']['tmp_name']);

    if (filesize($_FILES['file']['tmp_name']) <= 65536
            && $image_type === IMAGETYPE_GIF) {
        move_uploaded_file($_FILES['file']['tmp_name'],
            sprintf('../images/logos/%s.gif', str_replace(' ', '_', $name)));
    }
}

チェックをさらに分割し、ユーザーにエラー メッセージを表示するように改善できます。それはあなたに任せます。

于 2013-07-06T03:56:54.383 に答える
1

何も信用しないでください。

コンテンツが Web からのものである場合は、取得した時点ですべてが間違っていると想定してください。

Web アプリケーションでは、HTML に何も入力しないことは、サーバー側からの真の安全メカニズムと見なされるべきです。HTML と JS が提供するツールは、優れたユーザー エクスペリエンスを提供し、サーバーに送り返される内容の基本的な間違いの数を減らすのに非常に役立ちますが、悪意のある攻撃者は HTML/JS の保護をバイパスして、彼らは好きです。さらに楽しいのは、サーバーがジャンクでいっぱいになる可能性があることに注意しないと、トラフィックの少ないサイトでもボットがフォームの基本的なエラーをテストすることです。

(少なくとも)以下から保護する準備をする必要があります。

  • 間違ったファイル タイプ (ボットはこれをすぐにテストする可能性があります)。
  • ファイルが大きすぎます (ボットもこれをすばやくテストする可能性があります)。
  • サーバーのファイル システムで無効なファイル名の文字 (まれですが、表示されます)。
  • ファイル内の悪意のあるコンテンツ (それらを一般に公開する場合、ファイルの内容について多くの懸念があります)。
于 2013-07-06T04:22:04.093 に答える