PDA

View Full Version : سوال: بررسی کد آپلود



rash44
چهارشنبه 22 خرداد 1392, 09:53 صبح
سلام

لطفا این کد رو بررسی کنید و اگر مشکلی از نظر امنیتی داره راهنمائی کنید .


<?php
$typefiles=0;
$im=0;
$userfile = $_FILES['filedname']['tmp_name'];
$userfile_name = $_FILES['filedname']['name'];
$userfile_size = $_FILES['filedname']['size'];
$userfile_type = $_FILES['filedname']['type'];
$type=explode('.',$userfile_name);
$typefile=end($type);
switch ($typefile)
{
case 'jpg' :
case 'jpeg' :
$im = true;
break;
default :
$im = false;
break;
}
//
$filename = basename($newname);
$filename = $filename.'.'.$typefile;
//
if($userfile_size <= 0) {
echo "<script>alert('لطفا فایل را انتخاب نمائید')</script>";
echo "<script language='javascript'>history.go(-1);</script>";
exit();
} else if(!$im) {
echo "<script>alert('نوع فایل ارسالی غیر قابل قبول می باشد')</script>";
echo "<script language='javascript'>history.go(-1);</script>";
exit(); }
else if(!@copy($userfile, "$pathfile/$filename")) {
echo "<script>alert('متاسفانه فایل ارسال نشد . لطفا مجددا ارسال نمائید')</script>";
echo "<script language='javascript'>history.go(-1);</script>";
exit(); }
?>


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

rash44
چهارشنبه 22 خرداد 1392, 17:06 عصر
لطفا راهنمائی کنید

sedamorde
چهارشنبه 22 خرداد 1392, 17:29 عصر
سلام٬

من عادت دارم برای آپلود و چک کردن فرمت فایل به جای explode از ()pathinfo استفاده کنم و extension را که می‌خوام آپلود کنم مثل image/jpeg یا image/jpeg و .... به خاطر اینکه اگر اسم فایل text.jpg.php باشه explode اشتباه میکنه. بعد بنا به نیاز انداره فایل را چک می‌کنم و اگر بخوام مطمن بشم که کاربر عکس آپلود کرده سایز ابعاد عکس را هم چک می کنم و مثلا اگر از 2px کمتر بود آپلود نمی‌کنم.
راستی چک کردن اسم فایل هم بد نیست.

موفق باشید.

rash44
چهارشنبه 22 خرداد 1392, 18:14 عصر
سلام٬

به خاطر اینکه اگر اسم فایل text.jpg.php باشه explode اشتباه میکنه. ب

موفق باشید.

سلام
ممنون از راهنمائی
با :

$type=explode('.',$userfile_name);$typefile=end($t ype);
فکر نکنم explode اشتباه کنه و در مثال شما $typefile=php میشه

sedamorde
چهارشنبه 22 خرداد 1392, 18:46 عصر
خواهش میکنم.
درسته٬ ببخشید من به end دقت نکردم. به هر حال چک کردن اطلاعات فایل هم راهیه برای اطمینان از فرمت فایل‌ها.

rash44
چهارشنبه 22 خرداد 1392, 18:56 عصر
خواهش میکنم.
درسته٬ ببخشید من به end دقت نکردم. به هر حال چک کردن اطلاعات فایل هم راهیه برای اطمینان از فرمت فایل‌ها.

امکان داره با تکه کد توضیح بدین ؟

ravand
چهارشنبه 22 خرداد 1392, 22:11 عصر
این برنامه رو مهندس شهرکی نوشته:

<?php
if(isset($_FILES['photo']['name']) && $_FILES['photo']['error'] == 0) {
$photo = &$_FILES['photo'];
switch(strtolower($photo['type'])) {
case 'image/gif':
$src = ImageCreateFromGIF($photo['tmp_name']);
break;
case 'image/jpeg':
$src = ImageCreateFromJPEG($photo['tmp_name']);
break;
case 'image/png':
$src = ImageCreateFromPNG($photo['tmp_name']);
ImageAlphaBlending($src, false);
ImageSaveAlpha($src, true);
break;
case 'image/bmp':
$src = ImageCreateFromWBMP($photo['tmp_name']);
break;
default:
exit();
break;
}
$dst = ImageCreateTrueColor(ImageSX($src), ImageSY($src));
$white = ImageColorAllocate($dst, 255, 255, 255);
ImageFilledRectangle($dst, 0, 0, ImageSX($src), ImageSY($src), $white);
ImageCopyResampled($dst, $src, 0, 0, 0, 0, ImageSX($src), ImageSY($src), ImageSX($src), ImageSY($src));
ImageJPEG($dst, 'upload/' . substr($photo['name'], 0, strrpos($photo['name'], '.')) . '.jpg', 100);
ImageDestroy($dst);
ImageDestroy($src);
}
?>
با استفاده از کتابخانه ی GD.
کارهای دیگه ایکه میتونی بکنی اینه که از اجرای فایل های اجرایی در پوشه جلوگیری بکنی که اگر فایلی هم آپلود شد عمل نکنه:
در htaccess :

php_flag engine 0
RemoveHandler .phtml .php .php3 .php4 .php5 .php6 .phps .cgi .exe .pl .asp .aspx .shtml .shtm .fcgi .fpl .jsp .htm .html .wml
AddType application/x-httpd-php-source .phtml .php .php3 .php4 .php5 .php6 .phps .cgi .exe .pl .asp .aspx .shtml .shtm .fcgi .fpl .jsp .htm .html .wml
راه دیگه تغییر نام و پسوند عکس:

$newFile=$fileName.".".$setExt;