PDA

View Full Version : سوال: چجوری باگ این کد اپلود عکس رو از بین ببرم؟؟



saeed-71
دوشنبه 15 مهر 1392, 09:44 صبح
سلام.
این کد اپلود عکس من باگ داره.اما نمیدونم کجاش و چجوری اصلاحش کنم.


$exp=strrchr($_FILES["img"]["name"], ".");
if ($exp==".jpg" or $exp==".JPG" or $exp==".png" or $exp==".png" or $exp==".gif" or $exp==".gif")
{
$random_digit=rand(00000000,99999999);
$new_file_name=$random_digit.$file_name;
$folder = "upload/".$new_file_name;
$target = $folder . $_FILES["img"]["name"];
move_uploaded_file($_FILES["img"]["tmp_name"], $target);
}

Veteran
دوشنبه 15 مهر 1392, 09:56 صبح
shell.php.jpg هم اپلود میشه که !

رضا قربانی
دوشنبه 15 مهر 1392, 10:01 صبح
کلا 80 درصد سایت هایی که اجازه آپلود فایل ، عکس ، صوت رو به کاربرش میده طی مدت زمان 5 دقیقه امکان هکش هست . تا جایی که می تونید این امکان رو در اختیار کاربر معمولی سایتت قرار ندید .

saeed-71
دوشنبه 15 مهر 1392, 10:11 صبح
خوب اخه حتما باید امکان اپلود عکس رو بدم.نمیشه ندم.
چجوری کاری کنم که هک نشه؟:متفکر:

AliRezaPro
دوشنبه 15 مهر 1392, 10:39 صبح
سلام.
این کد اپلود عکس من باگ داره.اما نمیدونم کجاش و چجوری اصلاحش کنم.
از چه نظری فکر میکنید باگ داره ؟
برای مشکل .php ها , نام فایل را با . اکسپلود کنید و سپس خانه های ارایه را با for یا foreach بررسی کنید که داری کلمه ی php نباشد.

shell.php.jpg
مطمئنید همچین چیزی مشکل ساز است ؟کسی میتواند از بیرون به این فایل دسترسی داشته باشد؟ یعنی apache با این فایل همانند یک فایل php برخورد خواهد کرد ؟

eshpilen
دوشنبه 15 مهر 1392, 10:52 صبح
shell.php.jpg
مطمئنید همچین چیزی مشکل ساز است ؟کسی میتواند از بیرون به این فایل دسترسی داشته باشد؟ یعنی apache با این فایل همانند یک فایل php برخورد خواهد کرد ؟
اگر در مسیر www باشه، و بنابراین بتونه از طریق وب فراخوانی بشه، بله بعنوان یک فایل PHP اجرا میشه، اما، به شرطی که کانفیگ PHP/آپاچی هم نوع خاصی باشه. چون دو مدل کانفیگ در این ارتباط وجود داره.

منم اولش نمیدونستم و باورم نمیشد، ولی روش تحقیق و خودم هم تست کردم دیدم همچین چیزی واقعا صحت داره.

البته برای اینکه ببینید آیا هاست شما چنین کانفیگی داره یا نه، تستش راحته؛ کافیه یک فایل آزمایشی PHP به همین شکل روی هاست بریزید و فراخوانی کنید ببینید کدهای PHP داخلش اجرا میشن یا نه.

MMSHFE
دوشنبه 15 مهر 1392, 11:33 صبح
Apache رو نصب کنید و PHP رو در وضعیت mod_php نصب و اجرا کنید. حالا یک فایل به اسم image.php.jpg بسازین و با ++Notepad ویرایش کنید و کد زیر رو داخلش بنویسید و داخل پوشه ریشه وب سرویس قرار بدین.

<?php phpinfo(); ?>
حالا با واردکردن مسیر localhost/image.php.jpg فایل رو اجرا کنید و شاهد اجرا شدن کدهای PHP باشید.
اما روش رفعش که قبلاً هم درباره اش بحث شده:
1- PHP رو در وضعیت CGI (ترجیحاً FastCGI) نصب کنید.
2- mod_php رو در Apache از کار بندازین.
3- بجز نقطه آخر که برای پسوند لازمه، بقیه نقطه ها رو به کارکتر دیگه (مثل خط تیره یا Dash) تبدیل کنید.
4- عکسها رو با copy و move_uploaded_file و file_get_contents و اینجور روشها از پوشه آپلود موقت به پوشه نگهداری تصاویر منتقل نکنید.
5- بجای روشهای رایج که در مرحله قبلی اشاره شد، عکس رو از پوشه موقت ($_FILES['image']['tmp_name']) با کمک GD (توابع ImageCreateFromJPEG و ImageCreateFromPNG و... برحسب فرمت تصویر ($_FILES['image']['type']) بخونید و با همون GD یک تصویر در پوشه تصاویر از روش بسازین (ImageJPEG و ImagePNG و...).
6- قبل از اینکه تصویر رو ذخیره کنید، با کمک توابعی مثل getimagesize چک کنید ببینید تصویر اصلاً اندازه و... داره یا نه (کدهای PHP ابعاد تصویر ندارن). البته این رو بعنوان یک پارامتر امنیتی جانبی درنظر بگیرین چون ممکنه اسکریپت PHP با GD واقعاً یک تصویر هم تولید کنه ولی در کنارش کارهای مخرب هم انجام بده. در کل روی این مورد آخر بطور صرف تکیه نکنید چون خیلی قابل اعتماد نیست ولی بودنش بهتر از نبودنشه.

omidabedi
دوشنبه 15 مهر 1392, 11:43 صبح
روش جالبی رو اقای شهرکی گفتن :)

اما ایا نمیشه با explode و preg_match فرمت هارو فیلتر کرد؟

saeed-71
دوشنبه 15 مهر 1392, 11:46 صبح
Apache رو نصب کنید و PHP رو در وضعیت mod_php نصب و اجرا کنید. حالا یک فایل به اسم image.php.jpg بسازین و با ++Notepad ویرایش کنید و کد زیر رو داخلش بنویسید و داخل پوشه ریشه وب سرویس قرار بدین.

<?php phpinfo(); ?>
حالا با واردکردن مسیر localhost/image.php.jpg فایل رو اجرا کنید و شاهد اجرا شدن کدهای PHP باشید.
اما روش رفعش که قبلاً هم درباره اش بحث شده:
1- PHP رو در وضعیت CGI (ترجیحاً FastCGI) نصب کنید.
2- mod_php رو در Apache از کار بندازین.
3- بجز نقطه آخر که برای پسوند لازمه، بقیه نقطه ها رو به کارکتر دیگه (مثل خط تیره یا Dash) تبدیل کنید.
4- عکسها رو با copy و move_uploaded_file و file_get_contents و اینجور روشها از پوشه آپلود موقت به پوشه نگهداری تصاویر منتقل نکنید.
5- بجای روشهای رایج که در مرحله قبلی اشاره شد، عکس رو از پوشه موقت ($_FILES['image']['tmp_name']) با کمک GD (توابع ImageCreateFromJPEG و ImageCreateFromPNG و... برحسب فرمت تصویر ($_FILES['image']['type']) بخونید و با همون GD یک تصویر در پوشه تصاویر از روش بسازین (ImageJPEG و ImagePNG و...).
6- قبل از اینکه تصویر رو ذخیره کنید، با کمک توابعی مثل getimagesize چک کنید ببینید تصویر اصلاً اندازه و... داره یا نه (کدهای PHP ابعاد تصویر ندارن). البته این رو بعنوان یک پارامتر امنیتی جانبی درنظر بگیرین چون ممکنه اسکریپت PHP با GD واقعاً یک تصویر هم تولید کنه ولی در کنارش کارهای مخرب هم انجام بده. در کل روی این مورد آخر بطور صرف تکیه نکنید چون خیلی قابل اعتماد نیست ولی بودنش بهتر از نبودنشه.

میشه شما لطف کنی یه نمونه کد با امنیت بالا انجا قرار بدید تا یاد بگیرم و استفاده کنم؟

Veteran
دوشنبه 15 مهر 1392, 12:01 عصر
جناب شهرکی یک تابع نوشتن در بابل برای اپلود تصاویر که امنیت بالا بود/
اگر به صورت یک کلاس نوشته بشه که دوستان استفاده کنن خیلی خوبه
البته باید ایشون خودش اینکارو انجام بده چراکه ما حق انتشار کدهارو نداریم.

MMSHFE
دوشنبه 15 مهر 1392, 22:17 عصر
...ایا نمیشه با explode و preg_match فرمت هارو فیلتر کرد؟
بله میشه ولی همونطور که مثال زدم، توی فایلی که به ظاهر JPEG هست، کد PHP نوشته شده و واقعاً هم کار میکنه. درهرحال امن ترین روش اینه که بایتهای تصویر با GD خونده بشه و دوباره در یک فایل جدید ذخیره بشه. اینطوری کدهایی که علاوه بر تصویر توی فایل اصلی آپلود شده وجود داره، از بین میره.

saeed-71
سه شنبه 16 مهر 1392, 15:42 عصر
اقای شهرکی تین نمونه کدتون رو در اختیارمون نمیذارید؟

MMSHFE
سه شنبه 16 مهر 1392, 17:06 عصر
if(!defined('ROOT')) { define('ROOT', str_replace('\\', '/', dirname(__FILE__))); }
$photo = &$_FILES['photo'];
$allowedtypes = array('image/gif', 'image/jpeg', 'image/png', 'image/bmp');
if($photo['error'] == 0 && $photo['size'] <= 2097152 && in_array($photo['type'], $allowedtypes)) {
do {
$photoName = time();
sleep(1);
} while(file_exists(ROOT . '/photos/' . $photoName . '.jpg'));
switch(strtolower($photo['type'])) {
case 'image/bmp':
$src = ImageCreateFromWBMP($photo['tmp_name']);
break;
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']);
break;
}
$width = ImageSX($src);
$height = ImageSY($src);
$dst = ImageCreateTrueColor($width, $height);
ImageFill($dst, 0, 0, ImageColorAllocate($dst, 255, 255, 255));
ImageCopy($dst, $src, 0, 0, 0, 0, $width, $height);
ImageJPEG($dst, ROOT . '/photos/' . $photoName . '.jpg', 100);
ImageDestroy($dst);
ImageDestroy($src);
}

رضا قربانی
سه شنبه 16 مهر 1392, 17:42 عصر
الآن امنیت این فایل برقراره ؟ یعنی هیچ شلی نمیشه آپلود کرد ؟

MMSHFE
سه شنبه 16 مهر 1392, 18:03 عصر
امتحان کنید. من که امتحان کردم، کدهای اضافه توی فایل حذف شد. اگه تصویر واقعی نباشه، اصلاً آپلود نمیکنه و اگه هدرهای تصویر رو پیدا کنه و تصویر هم باشه و داخلش، کد هم درج شده باشه، کدها حذف میشن.

رضا قربانی
سه شنبه 16 مهر 1392, 18:05 عصر
امتحان کنید. من که امتحان کردم، کدهای اضافه توی فایل حذف شد. اگه تصویر واقعی نباشه، اصلاً آپلود نمیکنه و اگه هدرهای تصویر رو پیدا کنه و تصویر هم باشه و داخلش، کد هم درج شده باشه، کدها حذف میشن.
روی یه هاست آپلود کنید براتون شل آپلود کنم :لبخند:

saeed-71
سه شنبه 16 مهر 1392, 18:16 عصر
تشکر.ولی چجوری باید ازش استفاده کرد؟:متفکر:

MShariati
سه شنبه 16 مهر 1392, 18:56 عصر
برای اطمینان به محض اینکه آپلود فایلی تموم شد، میتونید اونو با یک خط کد به طور خودکار به جایی خارج از www انتقال بدید.

MMSHFE
سه شنبه 16 مهر 1392, 19:45 عصر
روی یه هاست آپلود کنید براتون شل آپلود کنم :لبخند:
زحمتش (و دردسرهای بعدیش) با خودتون :چشمک:

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

mnvoh90
سه شنبه 16 مهر 1392, 20:00 عصر
خوب وقتی MIME TYPE چک بشه که دیگه همچین مشکلی پیش نمیاد. میاد؟؟؟

Veteran
سه شنبه 16 مهر 1392, 20:02 عصر
من فکر میکنم MIME TYPE رو میشه بایپس کرد/

saeed-71
سه شنبه 16 مهر 1392, 20:03 عصر
منظور از این ROOT که نوشتید چیه؟

shahriyar3
سه شنبه 16 مهر 1392, 20:10 عصر
این کدی که آقای شهرکی نوشته منم تقریبا یه چیزی شبیه اینو برای آپلود استفاده میکنم منهای 2 تا فانکشنش که برای transparent کردن عکسه . بک گراند عکس و تغییر میده ولی تا حالا هیچ مشکلی پیش نیومده برای سایت هائی که طراحی کردم!!
همیشه من برای نمایش عکس از آدرس غیر مستقیم استفاده میکنم
سایز عکس هم من کلا تغییر میدم و اون چیزی که طراح در نظر گرفته میدم
الان شما(آقای رضا قربانی) چطوری برای همچین آدرسی میخوای فایل شل و فراخوانی کنید؟!!


<img src="showimg.php?x=123" >

mnvoh90
سه شنبه 16 مهر 1392, 20:19 عصر
من فکر میکنم MIME TYPE رو میشه بایپس کرد/
خوب وقتی نه extension و نه mime‌ پی اچ پی نباشه که آپاچی اسکریپت رو اینترپرت نمیکنه. میکنه؟؟؟

ویرایش: فکر کنم با embed‌ کردن هم بشه!!!

eshpilen
چهارشنبه 17 مهر 1392, 08:22 صبح
if(!defined('ROOT')) { define('ROOT', str_replace('\\', '/', dirname(__FILE__))); }
$photo = &$_FILES['photo'];
$allowedtypes = array('image/gif', 'image/jpeg', 'image/png', 'image/bmp');
if($photo['error'] == 0 && $photo['size'] <= 2097152 && in_array($photo['type'], $allowedtypes)) {
do {
$photoName = time();
sleep(1);
} while(file_exists(ROOT . '/photos/' . $photoName . '.jpg'));
switch(strtolower($photo['type'])) {
case 'image/bmp':
$src = ImageCreateFromWBMP($photo['tmp_name']);
break;
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']);
break;
}
$width = ImageSX($src);
$height = ImageSY($src);
$dst = ImageCreateTrueColor($width, $height);
ImageFill($dst, 0, 0, ImageColorAllocate($dst, 255, 255, 255));
ImageCopy($dst, $src, 0, 0, 0, 0, $width, $height);
ImageJPEG($dst, ROOT . '/photos/' . $photoName . '.jpg', 100);
ImageDestroy($dst);
ImageDestroy($src);
}

بد نیست ولی بنظرم همه جا نمیشه ازش استفاده کرد.
چون اومدید تمام فرمتها رو تبدیل کردید به یک فرمت دیگه؛ اونم یک فرمت دارای فشرده سازی lossy.
خیلی جاها و مواقع ممکنه این مطلوب نباشه یا اصلا نباید صورت بگیره.
مثلا فرمتهای png و bitmap خواص و مزایای خودشون رو دارن، و موقع تبدیل به jpg هم مقداری از اطلاعاتشون از بین میره. بسته به کاربرد، این میتونه نامطلوب یا به کلی غیرقابل قبول باشه.
همچنین مثلا فرمت gif (و همچنین png) از transparency پشتیبانی میکنه، اما فرمت jpg این ویژگی رو نداره. بنابراین تصویری که در این فرمت هست ممکنه که اصلا نباید به فرمت jpg تبدیل بشه.

saeed-71
چهارشنبه 17 مهر 1392, 08:46 صبح
به درد من میخوره.اما نمیدونم چجوری ازش استفاده کنم.
اقا این root که نوشیتید منظرتون چیه تو کد؟

MMSHFE
چهارشنبه 17 مهر 1392, 09:50 صبح
یه ثابت تعریف کردم که مسیر ریشه سایت رو داخلش ذخیره کنیم و از اونجا آدرسها رو بصورت مطلق وارد کنیم.

MMSHFE
چهارشنبه 17 مهر 1392, 09:51 صبح
بد نیست ولی بنظرم همه جا نمیشه ازش استفاده کرد.
چون اومدید تمام فرمتها رو تبدیل کردید به یک فرمت دیگه؛ اونم یک فرمت دارای فشرده سازی lossy.
خیلی جاها و مواقع ممکنه این مطلوب نباشه یا اصلا نباید صورت بگیره.
مثلا فرمتهای png و bitmap خواص و مزایای خودشون رو دارن، و موقع تبدیل به jpg هم مقداری از اطلاعاتشون از بین میره. بسته به کاربرد، این میتونه نامطلوب یا به کلی غیرقابل قبول باشه.
همچنین مثلا فرمت gif (و همچنین png) از transparency پشتیبانی میکنه، اما فرمت jpg این ویژگی رو نداره. بنابراین تصویری که در این فرمت هست ممکنه که اصلا نباید به فرمت jpg تبدیل بشه.
خوب این یه مثاله. میتونید اگه تصویر ورودی PNG یا GIF یا BMP بود، خروجی رو هم با همون فرمت تولید کنید. مجبور نیستین که حتماً JPEG بگذارین. کد رو میشه ویرایش کرد. مهم ایده پشت قضیه است.

رضا قربانی
چهارشنبه 17 مهر 1392, 10:01 صبح
این کدی که آقای شهرکی نوشته منم تقریبا یه چیزی شبیه اینو برای آپلود استفاده میکنم منهای 2 تا فانکشنش که برای transparent کردن عکسه . بک گراند عکس و تغییر میده ولی تا حالا هیچ مشکلی پیش نیومده برای سایت هائی که طراحی کردم!!
همیشه من برای نمایش عکس از آدرس غیر مستقیم استفاده میکنم
سایز عکس هم من کلا تغییر میدم و اون چیزی که طراح در نظر گرفته میدم
الان شما(آقای رضا قربانی) چطوری برای همچین آدرسی میخوای فایل شل و فراخوانی کنید؟!!


<img src="showimg.php?x=123" >

اصلا اون طوری که شما فکر می کنید نیست ،
چندین بار پست های در این باره رو آقا صادقیان پاک کرده .
اگه آقای شهرکی اجازه بده همین جا واسه همه آموزش بدم /؟\

MMSHFE
چهارشنبه 17 مهر 1392, 10:32 صبح
اشکالی نداره. اتفاقاً اینکه ببینیم چطور میشه به چنین اسکریپتهایی نفوذ کرد، برای اینکه بتونیم درمورد راه حل رفعش فکر کنیم، مفیده.

eshpilen
چهارشنبه 17 مهر 1392, 11:29 صبح
خوب این یه مثاله. میتونید اگه تصویر ورودی PNG یا GIF یا BMP بود، خروجی رو هم با همون فرمت تولید کنید. مجبور نیستین که حتماً JPEG بگذارین. کد رو میشه ویرایش کرد. مهم ایده پشت قضیه است.
خب آخه شیرین کاری قضیه همین جاست که با این کار یک حفره توی بخش از کد باز میشه!
البته بنده قبلا این حفره رو به شکلی پیشبینی کرده بودم (خیلی وقت پیش یادتون باشه همین بحث رو با هم داشتیم)، و وقتی تحقیق کردم دیدم بله همچین بحثی واقعا هم وجود داره، و دست آخر روی یکی از این فرمتها تست هم کردم، یعنی فقط با خوندن مقالهء ویکیپدیا درمورد اون فرمت، ظرف مدت کوتاهی یک فایل محتوی کد برنامه که از این روش عبور کنه درست کردم.
فکر میکنم قبلا اون قضیه رو مطرح کردم و حتی فایلش رو هم گذاشته بودم. شما یادتون نمیاد؟!

MMSHFE
چهارشنبه 17 مهر 1392, 13:40 عصر
یادم هست که قبلاً در این مورد با هم مباحثه داشتیم ولی حقیقتش کد تستتون یادم نمیاد. راستش خودم هم فرمتهای دیگه رو چک نکردم و ضمناً همیشه Inject کردن کد به این راحتی که فایل رو با ++Notepad باز کنیم و انتهاش کدهامون رو بنویسیم نیست و روشهای حرفه ای برای درج کد مخرب در فایلها هست که با این روشها قاعدتاً نمیشه جلوشو گرفت ولی بازهم تا حدود نسبتاً خوبی امنیت رو برقرار میکنه. البته به شرطی که در کنارش سایر موارد مثل Permissionهای پوشه آپلود و... رو هم درنظر بگیریم. حتی من توی هاست اختصاصی خودم، یک User کاملاً Limited ساختم و Owner پوشه آپلود و همچنین فایلهایی که توش آپلود میشه رو اون کاربر میگذارم و Permission اجرا رو هم از فایلها میگیرم و برای اینکه آپلود کار کنه، اسکریپت آپلود رو بصورت CGI و تحت کاربر root اجرا میکنم و وقتی فایل توی پوشه قرار گرفت، بلافاصله Owner فایل رو به همون کاربر Limited تغییر میدم و مجوز اجرا رو هم ازش میگیرم.

saeed-71
پنج شنبه 18 مهر 1392, 08:38 صبح
اقا یه مشکل هست.من کدوم ادرس رو باید تو دیتابیس به عنوان ادرس عکس ذخیره کنم؟

eshpilen
پنج شنبه 18 مهر 1392, 09:02 صبح
یادم هست که قبلاً در این مورد با هم مباحثه داشتیم ولی حقیقتش کد تستتون یادم نمیاد. راستش خودم هم فرمتهای دیگه رو چک نکردم و ضمناً همیشه Inject کردن کد به این راحتی که فایل رو با ++Notepad باز کنیم و انتهاش کدهامون رو بنویسیم نیست و روشهای حرفه ای برای درج کد مخرب در فایلها هست که با این روشها قاعدتاً نمیشه جلوشو گرفت ولی بازهم تا حدود نسبتاً خوبی امنیت رو برقرار میکنه. البته به شرطی که در کنارش سایر موارد مثل Permissionهای پوشه آپلود و... رو هم درنظر بگیریم. حتی من توی هاست اختصاصی خودم، یک User کاملاً Limited ساختم و Owner پوشه آپلود و همچنین فایلهایی که توش آپلود میشه رو اون کاربر میگذارم و Permission اجرا رو هم از فایلها میگیرم و برای اینکه آپلود کار کنه، اسکریپت آپلود رو بصورت CGI و تحت کاربر root اجرا میکنم و وقتی فایل توی پوشه قرار گرفت، بلافاصله Owner فایل رو به همون کاربر Limited تغییر میدم و مجوز اجرا رو هم ازش میگیرم.
مهندس فکر نمیکنم دیگه اینقدر هم نیاز به وسواس باشه.
اون مشکل اجرا کدهای PHP که براحتی با کانفیگ یا بررسی و خنثی کردن پسوندها قابل حله.
ولی البته این سمت سرور.
یه وقت هست طرف کدهای جاوااسکریپتی چیزی میذاره توی فایل که قبلا مشاهده کرده بودید که مرورگر IE در این زمینه مشکل داره و سرخود میاد و مثلا فایل با پسوند jpg رو بعنوان فایل جاوااسکریپت اجرا میکنه!!
ولی اینم باگ و مشکل IE هست. و البته خطر بیشتر در نسخه های قدیمیش مثل IE6 و 7 هست. بعد واسه اینم فکر میکنم یه راهکارهایی میشه اندیشید!
حالا اون کارها که شما سمت سرور میکنید نمیدونم واسه چی میکنید. مگه طرف میخواد چطوری چکار کنه؟ اونم وقتی فقط چند پسوند مجاز شناخته شده مثل تصاویر و فایلهای زیپ میتونه آپلود کنه.

saeed-71
پنج شنبه 18 مهر 1392, 09:05 صبح
این src رو که ذخیره میکنم تو دیتابیس ادرس نمیشه، اینو ذخیره میکنه!Resource id #6

saeed-71
پنج شنبه 18 مهر 1392, 23:04 عصر
این src رو که ذخیره میکنم تو دیتابیس ادرس نمیشه، اینو ذخیره میکنه!Resource id #6

MMSHFE
جمعه 19 مهر 1392, 09:43 صبح
مهندس فکر نمیکنم دیگه اینقدر هم نیاز به وسواس باشه.
هکرها رو نشناختی مگه؟ جالبه میبینم درمورد امنیت کوتاه میایی eshpilen جان ولی محض اطلاع عمومی بگم که خیلی پسوندها قابلیت نفوذ دارن. مثلاً توی فرمت WMV و WMA میشه کد Assembly بنویسی و جالبه که وقتی (فقط) با Media Player اجراش میکنی، کد Assembly در کمال تعجب Run میشه! ویروسهای داخل فایل JPEG و... هم که خیلی وقته قدیمی شدن. درسته که اکثر سرورها آنتی ویروسهای خوبی مثل ClamAV و... دارن ولی بجز چند سرور خوب و البته سرورهای اختصاصی، اکثراً Definition Database رو Update نمیکنن یا حتی آنتی ویروس برای مصرف بهینه حافظه!!! بصورت سرویس در پشت صحنه در حال اجرا نیست و باید خودتون هربار لازم داشتین، بگین فایلهای هاستتون رو Scan کنه. درهرحال روشی که گفتم، برای کسانی که سرور اختصاصی دارن، میتونه یک لایه خیلی خوب امنیتی ایجاد کنه. البته در کنارش نصب یک فایروال قدرتمند مثل CSF (اگه RAM به میزان 1 گیگابایت یا بیشتر دارن) هم میتونه گزینه خوبی باشه. البته اگه RAM سرور 512 مگابایت هم باشه، با ایجاد 512 مگابایت SWAP هم میشه فایروال رو نصب کرد و مشکلی نداره. ولی خوب همونطور که گفتم، تمام این موارد برای وقتی هست که سرور اختصاصی دارین و اگه از سرور اشتراکی استفاده میکنید، به امنیتی که براتون فراهم کردن باید اعتماد و اکتفا کنید و نهایتاً امنیت رو ازطریق اسکریپت میتونید تا حدودی تأمین کنید و بقیه اش رو باید به خدا توکل کنید.

MMSHFE
جمعه 19 مهر 1392, 09:45 صبح
اقا یه مشکل هست.من کدوم ادرس رو باید تو دیتابیس به عنوان ادرس عکس ذخیره کنم؟
شما باید متغیر $photoName رو توی دیتابیس ذخیره کنید و موقع نمایش هم اینطوری عمل کنید:

<img src="http://www.yoursite.com/photos/<?php echo $image['filename']; ?>.jpg" />

saeed-71
جمعه 19 مهر 1392, 10:15 صبح
اقا اسم عکس چجوری تعرف میشه؟
$photoName = time(); sleep(1);
منظورم اینکه برا هر عکس جدید یه عدد جدید تولید میشه؟ممکنه عدد تکراری هم برا عکس تولید بشه؟

MMSHFE
جمعه 19 مهر 1392, 10:23 صبح
نه عدد تکراری نیست. timestamp زمان Upload رو درنظر میگیره و اگه با اون عدد، یک عکس داشته باشیم (همزمان یک عکس دیگه هم آپلود شده باشه)، یک ثانیه صبر میکنه و دوباره timestamp میگیره و اینکار اینقدر تکرار میشه تا عدد غیر تکراری بدست بیاد.

saeed-71
جمعه 19 مهر 1392, 10:54 صبح
تشکر.اقا اگه بخوام 3تا عکس رو همزمان اپلود کنم چی؟3تا فیلد اپلود دارم که همزمان اپلود میشن

MMSHFE
جمعه 19 مهر 1392, 11:07 صبح
این کد آپلود رو بصورت تابع در بیارین. مثال:


function SafeUpload($name, $max_size = 2097152) {
$root = str_replace('\\', '/', dirname(__FILE__));
$allowedTypes = array ('image/gif', 'image/jpeg', 'image/png', 'image/wbmp');
if(!isset($_FILES [$name])) {
return false;
}
$file = &$_FILES [$name];
if($file ['error'] == 0 && in_array($file ['type'], $allowedTypes) && $file ['size'] <= $max_size) {
$in = '';
switch($file ['type']) {
case 'image/gif':
$in = 'ImageCreateFromGIF';
break;
case 'image/jpeg':
$in = 'ImageCreateFromJPEG';
break;
case 'image/png':
$in = 'ImageCreateFromPNG';
break;
case 'image/wbmp':
$in = 'ImageCreateFromWBMP';
break;
}
if($in == '') {
return false;
}
$src = $in($file ['tmp_name']);
$height = ImageSY($src);
$width = ImageSX($src);
$dst = ImageCreateTrueColor($width, $height);
ImageCopy($dst, $src, 0, 0, 0, 0, $width, $height);
$time = time();
while(file_exists($root . '/uploads/' . $time . '.jpg')) {
$time++;
}
ImageJPEG($dst, $root . '/uploads/' . $time . '.jpg', 100);
ImageDestroy($dst);
ImageDestroy($src);
return $time . '.jpg';
}
return false;
}
// Usage:
$name1 = SafeUpload('image1');
$name2 = SafeUpload('image2');
$name3 = SafeUpload('image3');

نکته: تابع SafeUpload اسم عنصر input فرم که برای آپلود فایل گذاشتین رو میگیره و آپلود میکنه. اگه مشکلی نبود، اسم فایل رو برمیگردونه و اگه مشکلی وجود داشت، false بر میگردونه. توی مثال فوق هم متغیرهای name1 و name2 و name3 رو میتونید چک کنید و هرکدوم false بود، بگین عکس رو دوباره آپلود کنه.

saeed-71
جمعه 19 مهر 1392, 11:13 صبح
اقا تصاویری که قبلا تو دیتابیسم ذخیره شدن به این صورتن
upload/93688964Chrysanthemum.jpg

الان اگه بخوام روش فراخونی عکس از دیتابیس رو تغییر بدم عکاسی قبلی خونده نمیشن!
الانم اومدم این خط رو تغییر دادم که با فرمت همون عکسای قبلی ذخیره بشه


$photoName =ROOT . '/upload/' .time(). '.jpg';



اما بعد اپلود تصویر ارور میده
Warning: imagejpeg() [function.imagejpeg (http://localhost/hyto/user/function.imagejpeg)]: Unable to open 'C:/xampp/htdocs/hyto/user/upload/C:/xampp/htdocs/hyto/user/upload/1381561096.jpg.jpg' for writing: Invalid argument in C:\xampp\htdocs\hyto\user\adcar.php on line 56

MMSHFE
جمعه 19 مهر 1392, 11:29 صبح
کد الآن ROOT دوبار داره مسیر رو نشون میده. باید کدتون رو چک کنید ببینید مشکل از کجاست. ضمناً اگه میخواین از این سیستم استفاده کنید، باید تصاویر قبلی رو یا دوباره آپلود کنید، یا اینکه بصورت دستی (و یا با Query) عبارت /upload و jpg. رو از ابتدا و انتهای فیلد آدرس عکس حذف کنید.

eshpilen
شنبه 20 مهر 1392, 07:59 صبح
هکرها رو نشناختی مگه؟ جالبه میبینم درمورد امنیت کوتاه میایی eshpilen جان ولی محض اطلاع عمومی بگم که خیلی پسوندها قابلیت نفوذ دارن. مثلاً توی فرمت WMV و WMA میشه کد Assembly بنویسی و جالبه که وقتی (فقط) با Media Player اجراش میکنی، کد Assembly در کمال تعجب Run میشه! ویروسهای داخل فایل JPEG و... هم که خیلی وقته قدیمی شدن.
مهندس اینا که گفتی همه مربوط به سمت کلاینت میشن (اونم اکثرا اختصاصی ویندوز هستن).
اون کارهایی که شما سمت سرور انجام میدی (ور رفتن با owner و پرمیشن ها) رو گفتم که نیازی نیست.
الان شما پشتک وارو هم بزنی بازم همون فایل در نهایت به کلاینت ارسال میشه.
در سمت سرور هم که این کارها دلیلی نداره.
البته پسوندهای مجاز باید محدود شده باشن به چند پسوند شناخته شده و مورد نیاز برای سیستم.

MMSHFE
شنبه 20 مهر 1392, 09:58 صبح
سمت کلاینت؟! کد Assembly روی همون سیستمی اجرا میشه که فایل روشه نه سمت کلاینت (اگه Player رو سایتتون بگذارین، میتونید در عمل این رو تست کنید). تازه اون فقط یک مثال بود. ویروسهایی که توی فایلهای JPEG و MPEG و... تزریق میشن (Worm و Trojan و...) رو چی میگین؟ وقتی Shell آپلود میشه، موقع اجرا کارهاش رو سمت سرور انجام میده.

eshpilen
شنبه 20 مهر 1392, 11:05 صبح
شما گفتید:

مثلاً توی فرمت WMV و WMA میشه کد Assembly بنویسی و جالبه که وقتی (فقط) با Media Player اجراش میکنی، کد Assembly در کمال تعجب Run میشه!
این تاجاییکه برمیاد به حفره ای در مدیاپلیر ویندوز (یا کدکها/کتابخانه هایی که مدیا پلیر ازشون استفاده میکنه) مربوط میشه و باید سمت کلاینت باشه.
سرور محتویات فایل رو فقط ارسال میکنه. حالا هر نوع فایلی میخواد باشه و سمت کلاینت هر پلیر و مرورگری که میخواد باشه.
اینکه در سمت سرور کد مخربی از طریق پخش شدن/ارسال برای کلاینت اجرا بشه، احتمال خیلی کمتری داره (هیچ چیزی غیرممکن نیست، ولی بعید بنظر میاد).
شاید شما منبعی رو اشتباه متوجه شدید یا اون منبع اشتباه نوشته بوده.
دلیل و سند بیشتری میتونید ارائه کنید؟


وقتی Shell آپلود میشه، موقع اجرا کارهاش رو سمت سرور انجام میده.
شل چه ربطی به این بحثها و حرفا داشت؟
شل که موقعی هست که هکر قبلا نفوذ کرده و بعدش برای راحت کردن کارش و اینکه بعدا بتونه سوء استفادهء بیشتر و سریعتری بکنه، حتی باوجود اینکه حفرهء اولیه بسته بشه، روی سایت نصب میکنه.
شل که معلومه روی هاست اجرا میشه. سمت کلاینت فقط اینترفیس اونه.
کد PHP داخل شل روی هاست اجرا میشه. چون خود شل اجرا میشه.
اما فایلی که به کلاینت فقط ارسال میشه چطور کدهای داخلش سمت سرور اجرا میشن؟!

MMSHFE
شنبه 20 مهر 1392, 12:48 عصر
نه ببینید، منظورم از فرمت مدیا پلیر صرفاً یک مثال بود که بگم اینطوری هم میشه ویروس/کد تزریق کرد و بطور کلی هیچ روشی صددرصد امن نیست. حالا میتونیم امنیت رو نزدیک به 100٪ کنیم. Shell هم ممکنه ازطریق فرم آپلود فایل تزریق بشه (اگه امنش نکنیم) و اگه سرور با mod_php راه افتاده باشه، با وارد کردن آدرس عکس، اسکریپت Shell اجرا بشه. حالا حتماً لازم نیست فایل توسط کلاینت درخواست بشه. مثلاً توی خیلی از اسکریپتها دیدم که آدرس فایلی که باید include بشه رو با GET میگیرن! خوب اینجا اگه یک کد مخرب آپلود شده باشه، نتیجه چی میشه؟ یا اگه پوشه حاوی فایل مخرب، مجوز اجرا داشته باشه و به هر طریقی (مثلاً خرید یک هاست روی همون سرور و درصورت عدم تنظیم مناسب سرور، دسترسی به فایلهای سایر سرورها)، اون فایل اجرا بشه، اونوقت نتیجه چی میشه؟ باز هم کد برای کلاینت اجرا میشه؟ درسته احتمال این موارد خیلی کمه ولی اکثر هکهای حرفه ای با این روشها انجام شدن. بنابراین باید برای سرورهای اختصاصی یا Cloud و یا هرجایی که امنیت خیلی برامون مهمه، جلوی این روشهای نفوذ رو هم بگیریم. همیشه سایتها با روشهای ساده مثل SQL Injection و Session Hijacking و امثال اینها که هک نمیشن. قصد من هم صرفاً اطلاع رسانی بود که دوستان بدونن امنیت، مسئله شوخی برداری نیست و کمترین موردش، امنیت آپلود فایلهاست.

saeed-71
یک شنبه 21 مهر 1392, 09:46 صبح
اقا چه کدی به این کد اپلود اضاف کنم تا حجم عکسا رو کاهش بده؟بعضیا میان عکس با حجم 2 مگ اپ میکنن.میخوام ای حجم حداکثر به 100 کیلوبایت برسه.

MMSHFE
یک شنبه 21 مهر 1392, 09:58 صبح
function SafeUpload($name, $max_size = 2097152, $filesize = 102400) {
$root = str_replace('\\', '/', dirname(__FILE__));
$allowedTypes = array ('image/gif', 'image/jpeg', 'image/png', 'image/wbmp');
if(!isset($_FILES [$name])) {
return false;
}
$file = &$_FILES [$name];
if($file ['error'] == 0 && in_array($file ['type'], $allowedTypes) && $file ['size'] <= $max_size) {
$in = '';
switch($file ['type']) {
case 'image/gif':
$in = 'ImageCreateFromGIF';
break;
case 'image/jpeg':
$in = 'ImageCreateFromJPEG';
break;
case 'image/png':
$in = 'ImageCreateFromPNG';
break;
case 'image/wbmp':
$in = 'ImageCreateFromWBMP';
break;
}
if($in == '') {
return false;
}
$src = $in($file ['tmp_name']);
$height = ImageSY($src);
$width = ImageSX($src);
$dst = ImageCreateTrueColor($width, $height);
ImageCopy($dst, $src, 0, 0, 0, 0, $width, $height);
$time = time();
while(file_exists($root . '/uploads/' . $time . '.jpg')) {
$time++;
}
$quality = 100;
do {
ImageJPEG($dst, $root . '/uploads/' . $time . '.jpg', $quality--);
} while(filesize($root . '/uploads/' . $time . '.jpg') > $filesize && $quality > 0);
ImageDestroy($dst);
ImageDestroy($src);
return $time . '.jpg';
}
return false;
}

saeed-71
یک شنبه 21 مهر 1392, 15:03 عصر
ببخشید ورودیش چیه؟ $name؟؟؟

abolfazl-z
یک شنبه 21 مهر 1392, 20:28 عصر
دوستان اگر از این طریق سایت هک بشه دیگه مشکل از کانفیگ سرور می باشد دیگه ؟ یا نه ؟

MMSHFE
دوشنبه 22 مهر 1392, 10:03 صبح
ببخشید ورودیش چیه؟ $name؟؟؟
اسم عنصر file توی فرم آپلود.

MMSHFE
دوشنبه 22 مهر 1392, 10:03 صبح
دوستان اگر از این طریق سایت هک بشه دیگه مشکل از کانفیگ سرور می باشد دیگه ؟ یا نه ؟
بخشی از اون تقصیر سرور هست (که mod_php کار میکنه) و بخش دیگه، مقصر خودتون هستین که اجازه دادین اسکریپت Shell آپلود بشه.