یکی از امکاناتی که در برنامه های تحت وب نیاز است، آپلود فایل ایت ، معمولا سایت ها قسمتی را برای آپلود (upload) فایل توسط کاربر قرار می دهند تا کاربر بتواند یک عکس، فایل فشرده شده (zip) یا هر نوع فایلی که مد نظر بوده است را بر روی سرور سایت، آپلود نماید.

امکان آپلود فایل ها باید بصورت کنترل شده و محدود در اختیار کاربران گذاشته شود تا نتوانند هر فایلی را آپلود کنند ، بلکه تنها فایل های بی خط و مورد نیاز را به سایت بفرستند.

باید دقت داشت که هنگامی که به کاربر اجازه می دهیم که فایلی را بر روی سرور سایت ما آپلود کند، عملا راهی برای نفوذ به سایت خود، در اختیار وی قرار داده ایم، بنابراین برای اینکه از سوء استفاده های احتمالی جلوگیری کنیم، باید یک سری محدودیت را برای آپلود فایل اعمال نماییم.

در اینجا ابتدا روشی ساده و ابتدایی برای  آپلود فایل معرفی کرده و در  ادامه ، اما این کد یک کد کامل تر و حرفه ای تر را استفاده می کنیم که با اعمال یک سری محدودیت، امنیت را بیشتر می کند.

برای قسمت آپلود، ابتدا یک فرم HTML می سازیم و سپس اطلاعات حاصل از فرم را به یک فایل PHP می فرستیم تا بر روی آن اطلاعات، پردازش کند (این شیوه کلی ساخت فرم ها است). بنابراین یک فایل با نامی دلخواه می سازیم و کدهای زیر را درون آن می نویسیم :

<html>
<body>
<form action="upload_file.php" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="Submit">
</form>
</body>
</html>

این فرم، اطلاعات را با روش POST ، به فایل upload_file.php می فرستد تا این فایل، بر روی اطلاعات دریافتی، پردازش کند. مشخصه enctype برای فرم، مشخص می کند که نوع اطلاعاتی که کاربر ارسال می کند، چه می باشد. با انتخاب multipart/form-data برای این مشخصه، اعلام کرده ایم که اطلاعات ارسالی، به صورت اطلاعات دودویی (binary data) است.

درون تگ input ، مشخصه type را برابر file قرار داده ایم تا اعلام کنیم که نوع ورودی، به صورت فایل می باشد. بنابراین درون فرم، یک دکمه browse به کاربر نمایش داده می شود تا با آن بتواند فایل مورد نظر را از کامپیوتر خود انتخاب نماید.

یک فایل با نام upload_file.php می سازیم و کدهای زیر را درون آن می نویسیم :

<?php
if ($_FILES["file"]["error"] > ۰){
echo "Error: " . $_FILES["file"]["error"] . "<br>";
}else{
echo "Upload: " . $_FILES["file"]["name"] . "<br>";
echo "Type: " . $_FILES["file"]["type"] . "<br>";
echo "Size: " . ($_FILES["file"]["size"] / ۱۰۲۴) . " kB<br>";
echo "Stored in: " . $_FILES["file"]["tmp_name"];
}
?>

متغیر $_FILES ، یک متغیر فوق سراسری (superglobal) می باشد.

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

برای کامل شدن و امن شدن آپلود فایل ، کدهای فایل upload_file.php را به صورت زیر می نویسیم تا جلوی آپلود فایل های مخرب گرفته شود:

<?php
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < ۲۰۰۰۰)
&& in_array($extension, $allowedExts)){
if ($_FILES["file"]["error"] > ۰){
echo "Error: " . $_FILES["file"]["error"] . "<br>";
}else{
echo "Upload: " . $_FILES["file"]["name"] . "<br>";
echo "Type: " . $_FILES["file"]["type"] . "<br>";
echo "Size: " . ($_FILES["file"]["size"] / ۱۰۲۴) . " kB<br>";
echo "Stored in: " . $_FILES["file"]["tmp_name"];
}
}else{
echo "Invalid file";
}
?>

در کد بالا تعیین کرده ایم که نوع فایلی که کاربر آپلود می کند، تنها می تواند gif یا jpeg یا png باشد و حداکثر حجم آن نیز باید ۲۰ کیلوبایت (kB) باشد (فایل های بزرگتر، آپلود نخواهند شد). اگر کاربر، فایلی را انتخاب کند که در شرایط فوق صدق نکند، آنگاه یک پیام با عنوان Invalid file به وی نمایش داده می شود.

ذخیره فایل آپلود شده :

با کد قبل، تنها یک کپی از فایل، به صورت موقت نگهداری می شود. عمر این نسخه کپی از فایل، تنها تا پایان اجرای کدها می باشد، بنابراین باید کدهایمان را به گونه ای تغییر بدهیم که بتوانیم فایل را در یک فولدر از سایت، ذخیره نماییم. کدهای فایل upload_file.php را به صورت زیر تکمیل می کنیم :

<?php
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < ۲۰۰۰۰)
&& in_array($extension, $allowedExts)){
if ($_FILES["file"]["error"] > ۰){
echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
}else{
echo "Upload: " . $_FILES["file"]["name"] . "<br>";
echo "Type: " . $_FILES["file"]["type"] . "<br>";
echo "Size: " . ($_FILES["file"]["size"] / ۱۰۲۴) . " kB<br>";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";
if (file_exists("upload/" . $_FILES["file"]["name"])){
echo $_FILES["file"]["name"] . " already exists. ";
}else{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
}else{
echo "Invalid file";
}
?>

برای اجرای صحیح کد بالا، باید یک فولدر با نام upload بسازیم تا فایل درون آن ذخیره شود (در صورت عدم وجود فولدر upload ، یک پیام خطا نمایش داده می شود).

کد بالا ابتدا چک می کند که آیا فایل درون فولدر upload وجود دارد یا خیر و چنانچه فایل وجود نداشته باشد، یک کپی از آن را در فولدر upload ذخیره خواهد کرد. در صورتی که فایلی با آن نام درون فولدر upload وجود داشته باشد، یک پیام نمایش داده می شود که فایل هم اکنون وجود دارد و بنابراین فایل جدید، ذخیره نخواهد شد.

نمایش قابل چاپ