web-dev-qa-db-ja.com

WordPressの組み込み関数を使用してアップロードされた画像を検証しますか?

ユーザーが画像をアップロードできるフォームがあります。ユーザーがアップロードしたものが有効であることを確認するために、以下のコード(現在は機能しません)を使用しています。

誰かが私の手助けをして私のコードを更新するか、または私がどのように処理するのに適していると思いますか?可能な限り検証?悪意のあるファイルや攻撃などを防ぐためにも安全である必要があります。

if ( $_FILES ) {
  foreach ($_FILES as $file => $array) {
    //Check if the $_FILES is set and if the size is > 0 (if =0 it's empty)
    if ( isset( $_FILES[$file]) && ($_FILES[$file]['size'] > 0 ) ) {
      $tmpName = $_FILES[$file]['tmp_name'];
      list($width, $height, $type, $attr) = @getimagesize($tmpName);

      if ($width != 500 || $height != 500) {
        $error .= "Image is to small<br />";
        unlink($_FILES[$file]['tmp_name']);
      }

      // Get the type of the uploaded file. This is returned as "type/extension"
      $arr_file_type = wp_check_filetype(basename($_FILES[$file]['name']));
      $uploaded_file_type = $arr_file_type['type'];

      // Set an array containing a list of acceptable formats
      $allowed_file_types = array('image/jpg','image/jpeg','image/gif','image/png');

      // If the uploaded file is the right format
      if (in_array($uploaded_file_type, $allowed_file_types)) {
      } else { // wrong file type
        $error .= "Please upload a JPG, GIF, or PNG file<br />";
      }
    }
  }
}
1
user1462

あなたの質問の中のすべてのコードは次のように置き換えることができます。

require_once( ABSPATH . 'wp-admin/includes/image.php' );
require_once( ABSPATH . 'wp-admin/includes/file.php' );
require_once( ABSPATH . 'wp-admin/includes/media.php' );
if ( $_FILES ) {
  foreach ($_FILES as $file => $array) {
    $image_post_id = media_handler_upload( $file );
    if ( is_wp_error( $image_post_id ) ) {
      $error .= $image_post_id->get_error_message();
    } else {
      // $image_post_id now holds the post ID of an attachment that is your uploaded file
    }
  }
}

media_handle_upload の威力は、セキュリティ、確認、およびWordPress Coreへのアップロードを完全にアウトソーシングしたことを意味します。 media_handle_uploadはあなたのプロジェクトを終えた後もずっと、私達のどちらよりもはるかに賢い人々、そしてWordPressを安全に保つことに既得の関心を持っている人々によって維持されます。

media_handle_uploadは、ダッシュボードを使ってアップロードしたときに得られるすべてのチェックを行い、データベース内のこれらのアップロードされたファイルを表す添付ファイルの投稿を作成します。また、さまざまな画像サイズの作成、プラグインとの互換性、およびダッシュボードで指定されたセキュリティ設定の尊重も行います。

成功した場合は、作成した添付ファイル投稿のIDを返します。失敗した場合は、エラーメッセージとともにWP_Errorオブジェクトを返します。

添付ファイルの完全なURLが必要な場合は wp_get_attachment_url 、特定のサイズを取得する必要がある場合は wp_get_attachment_image_src を使用できます。画像、例えば:

$image = wp_get_attachment_image_src( $image_post_id, 'thumbnail' );
if ( $image != false ) {
    echo $image[0];
}
3
Tom J Nowell