آموزش آپلود فایل در php همراه با امنیت

1397/3/17 علیرضا حاتمی نیا 2126

 

خدمت شما کاربران محترم وبسایت آموزش برنامه نویسی و طراحی وب سلام عرض می کنم. امروز هم با یک آموزش ویژه در خدمت شما هستم. امروز با آموزش آپلود تصویر توسط php در خدمت شما هستیم.

پیش نیازها:

قبل از شروع آموزش لازم است تا با مفاهیم زیر آشنایی داشته باشید:

آپلود فایل توسط php

همانطور که می دانید آپلود و بارگزاری تصویر از ابزارهایی بسیار کاربردی برای مدیریت یک وبسایت است. توسط PHP به راحتی می توانید فایل ها را در سرور آپلود کنید. البته همین راحتی در آپلود فایلها می تواند امنیت سایت را به خطر بیاندازد پس حتما باید مراقب فایل های ارسالی باشید. در این آموزش ابتدا فایل آپلود شده را از نظر نوع و حجم بررسی می کنیم و در صورت صحت اطلاعات آن را روی سرور آپلود می کنیم.

پیکره بندی فایل "php.ini"

ابتدا مطمئن شوید که php مجوز آپلود فایل را می دهد. برای این کار فایل "php.ini" را باز کنید و عبارت file_uploads را جستجو کنید و سپس مقدار آن را به on تغییر دهید.
file_uploads = On

ساخت فرم HTML

سپس یک فرم HTML بسازید تا کاربران قادر به انتخاب تصویر و ارسال آن به سمت سرور جهت آپلود را داشته باشند.
<!DOCTYPE html>
<html>
<body>

<form action="upload.php" method="post" enctype="multipart/form-data">
    Select image to upload:
    <input type="file" name="myFile" id="myFile">
    <input type="submit" value="Upload Image" name="submit">
</form>

</body>
</html>

در فرم بالا دقت داشته باشید که دو نکته زیر را حتما رعایت کنید:

  1. فرم حتما با روش post ارسال شود.
  2. فرم حتما بایستی از خصوصیت enctype="multipart/form-data" استفاده کند. این خصوصیت مشخص می کند که فرم چه نوع محتوایی را ارسال می کند.
بدون رعایت نکات بالا آپلود فایل کار نخواهد کرد.
فرم بالا داده ها را به سمت فایلی با نام upload.php ارسال می نماید. در ضمن فرم دارای یک تگ <input> از نوع file است که کاربر با کلیک روی دکمه Browse تصویر مورد نظر خود را انتخاب و توسط دکمه submit به سمت سرور ارسال می کند.

ساخت فایل آپلود در PHP

فایل upload.php شامل کدهای زیر است:
<?php
$upload_dir = "uploads/";
$upload_file = $upload_dir . basename($_FILES["myFile"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($upload_file,PATHINFO_EXTENSION));
// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["myFile"]["tmp_name"]);
    if($check !== false) {
        echo "File is an image - " . $check["mime"] . ".";
        $uploadOk = 1;
    } else {
        echo "File is not an image.";
        $uploadOk = 0;
    }
}
?>

توضیج کدهای PHP بالا:

  • $upload_dir = "uploads/": تعیین کننده پوشه یا دایرکتوری محل ذخیره فایل است
  • $upload_file: تعیین کننده مسیره ذخیره فایل است.
  • $uploadOk: مقدار پیشفرض 1 دارد و اگر در هنگام آپلود فایل خطایی صورت گرفت مقدار آن برابر 0 می شود و سپس پیام اخطار نمایش داده میشود.
  • $imageFileType: توسط تابع pathinfo پسوند فایل فرستاده شده را در خود ذخیره میکند.( حروف بزرگ به کوچک تبدیل می شوند)
سپس در ادامه بررسی می کنیم که فایل فرستاده شده تصویر واقعی است یا نوع دیگری
توجه داشته باشید بایستی یک پوشه با نام uploads جهت ذخیره تصاویر بسازید. نام این پوشه با مقدار $upload_dir برابر می کند.
بررسی موجود بودن فایل
حال می توانیم کمی محدودیت اعمال کنیم. در این قسمت بررسی می کنیم که اگر فایل با این نام قبلا آپلود شده یک پیام خطا به کاربر نمایش داده شود.
if (file_exists($upload_file)) {
    echo "Sorry, file already exists.";
    $uploadOk = 0;
}

این کار توسط تابع file_exists() روی مسیر تعیین شده توسط $upload_file انجام می شود. این تابع موجودیت یک فایل را در مسیر داده شده بررسی می کند و مقدار true یا false را بر می گرداند.

بررسی اندازه فایل

حال بررسی می کنیم که اگر حجم فایل ارسال شده بیشتر از 500KB باشد پیام اخطار نمایش داده شود و مقدار $uploadOk نیز برابر 0 شود.
if ($_FILES["myFile"]["size"] > 500000) {
    echo "Sorry, your file is too large.";
    $uploadOk = 0;
}

محدودیت برای نوع فایل

مقدار متغیر $imageFileType برابر با پسوند فایل ارسال شده است. با استفاده از همین متغیر می توانیم تعیین کنیم که فقط تصاویر با پسوندهای jpg,png,gif,jpeg می توانند آپلود شوند.
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
    echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
    $uploadOk = 0;
}

تکمیل فایل upload.php

در نهایت مقدار $uploadOk را بررسی می کنیم. اگر 0 بود پیام خطای آپلود فایل به کاربر نمایش داده می شود. و اگر برابر با 1 بود توسط تابع move_uploaded_file() تصویر مورد نظر را آپلود می کنیم. این تابع دو پارامتر اجباری دریافت می کند. اولین پارامتر فایل آپلود شده در پوشه مقوت tmp سرور و دومین پارمتر مسیر تعیین شده برای آپلود فایل روی سرور است.

if ($uploadOk == 0) {
        echo "Sorry, your file was not uploaded.";
// if everything is ok, try to upload file
    } else {
        if (move_uploaded_file($_FILES["myFile"]["tmp_name"], $upload_file)) {
            echo "The file ". basename( $_FILES["myFile"]["name"]). " has been uploaded.";
        } else {
            echo "Sorry, there was an error uploading your file.";
        }
    }