Aynı $ _FILES dizi hem bunları elde ederken doğrulamaları 2 farklı ['type'] ayarlamak mümkün mü?

1 Cevap

Benim formunda bir PDF dosyası yüklemek için birini soran & am bir görüntü. Her ikisi de aynı dizi $ HTTP_POST_FILES ['rfiles'] dizisi gönderiliyor. Ben $ _FILES ['rfiles'] ['type'] doğrulamak istiyorum [0] "application / pdf" veya "metin / düz" özel ve $ _FILES ['rfiles'] ['type'] [1] ila bir "image / *" Bu ilk bölüm kodun çalışma parçasıdır. Ben onun verdiği ölçüde (Foreach / [$ key]) kullanmaya çalışıyorum. I = 'rfiles []' form adını kullanmadan 2 dosya göndermek için çalıştık, ama sonra $ _FILES bir coniption vardır. Bu yüzden Foreach yöntem zaten kullanılmalıdır görünüyor.

foreach ($_FILES['rfiles']['error'] as $key => $error) {
   $tmp_name = $_FILES['rfiles']['tmp_name'][$key];
   if (!$tmp_name) continue;

   $name = basename($_FILES['rfiles']['name'][$key]); #the recycled variable

  #This is where the other code would rest.

   if ($error == UPLOAD_ERR_OK)
{   
    if (file_exists("/restdata/" . $_FILES["rfiles"]["name"][$key])) #Checking for a duplicate filename
        {
  echo $_FILES["rfiles"]["name"][$key] . " is currenty in use. Please rename your file to a unique name and try again.<br />\n";$badul[$key]=1; #badul[] is to be used later in the page in the followup form.
        }
    else
        { 
            if ( move_uploaded_file($tmp_name, "/restdata/".$name) ) {
            $uploaded_array[] .= "Uploaded file '".$name."'.<br/>\n";
                echo "File is valid, and was successfully uploaded.\n<br />\n";
                echo ($_FILES["rfiles"]["type"][$key]. " is a proper format.<br />\n"); #Mostly being used for testing purposes to get the correct MIME. But, how do I validate it?
                echo ($uploaded_array[$key] . "<br>\n");
                }
        else 
                {
        $errormsg .= "Could not move uploaded file '".$tmp_name."' to '".$name."'<br/>\n";  
                } # end if/else move_upoaded File
            } #end if/else file_exists 
} #end if $error == UPLOAD_ERR_OK
else $errormsg .= "Upload error. [".$error."] on file '".$name."'<br/>\n";
    echo ( $errormsg );
} #End Foreach

Ben $ tuşunu kullanarak tutmak için abe olacak ama oldukça bir dizi bir dizi yapmak gibi olamaz çünkü ben 2 farklı yöntemler denedikten sağlam Foreach döngü tutmak için çalıştılar, 1 tek iyi olurdu. Hataları unpassable görünüyordu çünkü benim çalışma komut bu kaldırıldı

#absolutey predefine these variables before the Foreach statement. 
$allowedExtensions[0] = array("txt", "rtf", "doc", "pdf");
$allowedExtensions[1] = array("gif", "jpg", "jpeg");

       ...
        $file = $_FILES['rfiles'];

        function isAllowedExtension($fileName) {
          global $allowedExtensions[$key]; #tricky tricky?

          return in_array(end(explode(".", $fileName)), $allowedExtensions[$key]);
        }

        if($error == UPLOAD_ERR_OK) {
          if(isAllowedExtension($file['name'][$key]))
        ...

Argümanlar 1 geçerse, 2 dosyası ne olduğunu önemli değil çünkü diğer bir yöntem sadece çok delik bırakır:

    ...
if (((($_FILES["rfiles"]["type"][1] == "image/gif")
    || ($_FILES["rfiles"]["type"][1] == "image/jpeg")
    || ($_FILES["rfiles"]["type"][1] == "image/pjpeg"))
    && ($_FILES["rfiles"]["size"][1] < 5000000))
    || ((($_FILES["rfiles"]["type"][0] == "text/plain") #probaby the wrong syntax, but worth a shot.
    || ($_FILES["rfiles"]["type"][0] == "application/pdf")
    || ($_FILES["rfiles"]["type"][0] == "text/rtf"))
    && ($_FILES["rfiles"]["size"][0] < 15000000)))
      {
      if ($error == UPLOAD_ERR_OK)...

Ben $ HTTP_POST_FILES & aracılığıyla doğrudan saldırmaya teşebbüs ettik .. başka bir yolu var mı onu patlatmaya çalıştı?

EDIT: açıklama amaçları için - ayrı ayrı dosya doğrulamaları idare edebilmek gerekir. Değerleri ayrı ayrı veritabanına işleniyor. Belirli bir hata ile müşteri sağlamak mümkün değil onların ucunda çok karışıklık yaratacaktır.

1 Cevap

Beklendiği gibi aşağıdaki ile ikinci yöntem yerine, o çalışması gerekir:

...
if (((($_FILES["rfiles"]["type"][1] == "image/gif")
    || ($_FILES["rfiles"]["type"][1] == "image/jpeg")
    || ($_FILES["rfiles"]["type"][1] == "image/pjpeg"))
    && ($_FILES["rfiles"]["size"][1] < 5000000))
    && ((($_FILES["rfiles"]["type"][0] == "text/plain") #probaby the wrong syntax, but worth a shot.
    || ($_FILES["rfiles"]["type"][0] == "application/pdf")
    || ($_FILES["rfiles"]["type"][0] == "text/rtf"))
    && ($_FILES["rfiles"]["size"][0] < 15000000)))
  {
  if ($error == UPLOAD_ERR_OK)...