web-dev-qa-db-fra.com

Valider l'image téléchargée à l'aide des fonctions intégrées de WordPress?

J'ai un formulaire qui permet aux utilisateurs de télécharger une image. J'utilise le code ci-dessous (qui ne fonctionne pas actuellement) pour garantir la validité des envois des utilisateurs.

Quelqu'un peut-il m'aider et mettre à jour mon code ou me diriger dans la bonne direction sur la manière d'utiliser autant de fonctions WordPress intégrées (wp_check_filetype_and_ext ()), ou toute autre fonction qui conviendrait bien, pour gérer la validation possible? Il doit également être sécurisé pour empêcher tout fichier malveillant, attaque, etc.

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

Tout le code de votre question peut être remplacé par:

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
    }
  }
}

La puissance de media_handle_upload signifie que vous avez maintenant complètement externalisé votre sécurité, vos contrôles et votre téléchargement vers WordPress Core. media_handle_upload sera conservé longtemps après la fin de votre projet, par des personnes beaucoup plus intelligentes que l’un d’entre nous et par d’autres personnes ayant un intérêt particulier à protéger WordPress.

media_handle_upload effectuera toutes les vérifications que vous obtiendrez lorsque vous téléchargerez des éléments via le tableau de bord, et créera des publications en pièce jointe pour représenter ces fichiers téléchargés dans la base de données. Il gérera également la création de différentes tailles d'image, la compatibilité avec les plug-ins et respectera les paramètres de sécurité spécifiés dans le tableau de bord.

En cas de succès, il renverra l'ID de la pièce jointe créée. En cas d'échec, il retournera un objet WP_Error avec un message d'erreur.

Vous pouvez ensuite utiliser wp_get_attachment_url si vous avez besoin de l’URL complète de la pièce jointe, ou wp_get_attachment_image_src si vous souhaitez obtenir une taille particulière pour l’image, par exemple:

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