メールフォームにファイルアップロード機能を実装する練習をしています。
1 index.phpで入力→
2 confirm.phpに遷移、送信。→送信しました。
という流れですが、
ファイルサイズに制限をかけて、
画像を選びなおすようにエラー表示させたいです。
ファイル選択は必須項目としているので、
サイズが大きすぎますというメッセージを表示しつつ、
制限値内の画像を選びなおさないと、2の確認画面に進めないようにしたいです。
【試したこと】
上のindex.phpで、inputのMAX_FILE_SIZEを入れることで
value値より大きい画像は無効になりましたが、
confirm.phpへは進めてしまい、画像0KBとして送信できてしまいます。
この場合、どのような方法があるでしょうか。
php
1【confirm.php】 2<?php 3 4function h($str) { 5 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 6} 7 8// 変数の初期化 9$page_flag = 0; 10 11if( !empty($_POST['confirm']) ) { 12 $page_flag = 1; 13 14 try { 15 // 未定義である・複数ファイルである・$_FILES Corruption 攻撃を受けた 16 // どれかに該当していれば不正なパラメータとして処理する 17 if (!isset($_FILES['upfile']['error']) || !is_int($_FILES['upfile']['error'])) { 18 throw new RuntimeException('パラメータが不正です'); 19 } 20 // $_FILES['upfile']['error'] の値を確認 21 switch ($_FILES['upfile']['error']) { 22 case UPLOAD_ERR_OK: // OK 23 break; 24 case UPLOAD_ERR_NO_FILE: // ファイル未選択 25 throw new RuntimeException('ファイルが選択されていません'); 26 case UPLOAD_ERR_INI_SIZE: // php.ini定義の最大サイズ超過 27 case UPLOAD_ERR_FORM_SIZE: // フォーム定義の最大サイズ超過 (設定した場合のみ) 28 throw new RuntimeException('ファイルサイズが大きすぎます'); 29 default: 30 throw new RuntimeException('その他のエラーが発生しました'); 31 } 32 // ここで定義するサイズ上限のオーバーチェック 33 // (必要がある場合のみ) 34 if ($_FILES['upfile']['size'] > 1000000) { 35 throw new RuntimeException('ファイルサイズが大きすぎます'); 36 } 37 // $_FILES['upfile']['mime']の値はブラウザ側で偽装可能なので 38 // MIMEタイプに対応する拡張子を自前で取得する 39 if (!$ext = array_search( 40 mime_content_type($_FILES['upfile']['tmp_name']), 41 array( 42 'gif' => 'image/gif', 43 'jpg' => 'image/jpeg', 44 'png' => 'image/png', 45 ), 46 true 47 )) { 48 throw new RuntimeException('ファイル形式が不正です'); 49 } 50 // ファイルデータからSHA-1ハッシュを取ってファイル名を決定し,保存する 51 if (!move_uploaded_file( 52 $_FILES['upfile']['tmp_name'], 53 $path = sprintf('./files/%s.%s', 54 sha1_file($_FILES['upfile']['tmp_name']), 55 $ext 56 ) 57 )) { 58 throw new RuntimeException('ファイル保存時にエラーが発生しました'); 59 } 60 // ファイルのパーミッションを確実に0644に設定する 61 chmod($path, 0644); 62 echo 'ファイルは正常にアップロードされました'; 63 } catch (RuntimeException $e) { 64 echo $e->getMessage(); 65 } 66
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/10 09:28