PDA

View Full Version : ایجاد یک تصویر از روی تصویر دیگر با php



olampiad
جمعه 15 آبان 1394, 19:42 عصر
سلام و خسته نباشید
من میخوام با استفاده از php از روی یک تصویر یک تصویر دیگه ای بسازم.
یعنی با استفاده از توابع gd از روی تصویر کپی بگیرم و یک تصویر دیگه ای بسازم.
من میخوام این کار رو برای آپلود استفاده کنم.
تو مطالب زیادی خوندم که برای آپلود فابل از توابع gd استفاده کنین تا امنیت داشته باشه.


من کد پایین رو برای کپی و ایچاد فایل جدید از نت برداشتم ولی کار نمیکنه.
کد بهتری دارید.
مشکل از کجای کد هستش.
ممنون



$src_file = 'desert.jpg';
list($src_w, $src_h) = getimagesize($src_file);


$ptrImage='sss.jpg';


$dst_w = 400;
$dst_h = 200;


$ptr_x = 195;
$ptr_y = 70;


$ptr_w = 105;
$ptr_h = 100;


$srcImage = imagecreatefromjpeg($src_file);
$dstImage = imagecreatetruecolor($dst_w,$dst_h);
imagecopyresampled($dstImage,$srcImage,0,0,0,0,$ds t_w, $dst_h, $src_w, $src_h);
imagejpeg($src_file,'sss.jpg',100);
imagedestroy($srcImage);

olampiad
شنبه 16 آبان 1394, 13:10 عصر
سلام و خسته نباشید به دوستان عزی
به این کد ی نگا بندزاید.
آیا استفاده از این توابع برای جلوگیری از آپلود شل درسته؟
ممنون



$img = imagecreatefromjpeg($_FILES['img1']['tmp_name']);imagejpeg($img, 'aaa.jpg',100);

djtrex
شنبه 16 آبان 1394, 14:57 عصر
سلام و خسته نباشید
من میخوام با استفاده از php از روی یک تصویر یک تصویر دیگه ای بسازم.
یعنی با استفاده از توابع gd از روی تصویر کپی بگیرم و یک تصویر دیگه ای بسازم.
من میخوام این کار رو برای آپلود استفاده کنم.
تو مطالب زیادی خوندم که برای آپلود فابل از توابع gd استفاده کنین تا امنیت داشته باشه.


من کد پایین رو برای کپی و ایچاد فایل جدید از نت برداشتم ولی کار نمیکنه.
کد بهتری دارید.
مشکل از کجای کد هستش.
ممنون



$src_file = 'desert.jpg';
list($src_w, $src_h) = getimagesize($src_file);


$ptrImage='sss.jpg';


$dst_w = 400;
$dst_h = 200;


$ptr_x = 195;
$ptr_y = 70;


$ptr_w = 105;
$ptr_h = 100;


$srcImage = imagecreatefromjpeg($src_file);
$dstImage = imagecreatetruecolor($dst_w,$dst_h);
imagecopyresampled($dstImage,$srcImage,0,0,0,0,$ds t_w, $dst_h, $src_w, $src_h);
imagejpeg($src_file,'sss.jpg',100);
imagedestroy($srcImage);


متاسفانه روش اشتباهی رو برای تامین امنیت آپلود فایلتون در نظر گرفتید و همچنین تاپیک های زیر:
http://barnamenevis.org/showthread.php?511579-%D8%B1%D9%88%D8%B4-%D8%AA%D8%B4%D8%AE%DB%8C%D8%B5-%D8%AF%D9%82%DB%8C%D9%82-%D9%81%D8%A7%DB%8C%D9%84-%D9%88%DB%8C%D8%AF%DB%8C%D9%88%DB%8C%DB%8C-%D8%9F%D8%9F%D8%9F&
http://barnamenevis.org/showthread.php?511844-%D9%86%D8%AF%D8%A7%D8%B4%D8%AA%D9%86-%DA%A9%DB%8C%D9%81%DB%8C%D8%AA-%D8%AA%D8%B5%D8%A7%D9%88%DB%8C%D8%B1-png-%D8%B3%D8%A7%D8%AE%D8%AA%D9%87-%D8%B4%D8%AF%D9%87-%D8%A8%D8%A7-gd&
http://barnamenevis.org/showthread.php?511501-%D9%86%D8%B8%D8%B1-%D8%AF%D8%B1-%D9%85%D9%88%D8%B1%D8%AF-%D8%B3%D8%A7%DB%8C%D8%AA
و ...

برای عکس میتونید از gd استفاده کنید (اونم کیفیت تصویر امکان داره تغییر کنه!)
برای ویدیو راه حل نه چندان جالب ffmpeg رو استفاده می کنید.
برای pdf / csv / xml / docs / xslx / pptx / rar / zip / gz و ... چی کار میخواید بکنید؟!!

اول از همه پیشنهاد میکنم این مطلب رو کامل بخونید در مورد آپلود امن فایل:
https://www.acunetix.com/websitesecurity/upload-forms-threat/

مهمترین قسمتش اینه:





Create a list of accepted mime-types (map extensions from these mime types).


Generate a random file name and add the previously generated extension.



که اینجا هم بهش اشاره شده:
http://symfony.com/doc/current/cookbook/controller/upload_file.html

خلاصه:
یه لیست سفید از mime type ها داشته باشید که به extension اونها map شده. کافیه یه اسم رندوم و یونیک بسازید و اون extension رو بهش اضافه کنید.

(البته این مهمترین قسمتش بود ولی راهکارهای امنیتی دیگه هم باید انجام بدید مثلا اگه از وب سرور apache استفاده میکنید اجازه rewrite رو برای htaccess ندید (با تعیین سطح permissionها - خوشبختانه با وب سرور nginx کمتر از این معضلات دارید!!!) یا جدا کدن فولدر upload و ... )

حالا این mime-type ها و extension هارو از کجا بیارید؟ توی اینترنت میتونید سرچ کنید. اینجا هم لیست خوبی هست:
https://github.com/symfony/http-foundation/blob/master/File/MimeType/MimeTypeExtensionGuesser.php

البته این رو هم داشته باشید شما نمیتونید ۱۰۰ درصد تایید کنید عکس واقعا عکسه! اگه عکسش مشکل داشته مرورگر اونو لود نمیکنه همین! ولی مهم تر اینه مشکل امنیتی برای سیستمون ایجاد نکنه.

-------------------

با این حال اگه فقط کارتون با عکس هست از این پکیج استفاده کنید هم کار باهاش خیلی راحت تره هم امکانات خیلی خوبی داره مثل crop / centercrop /resize /watermark و ...
http://image.intervention.io/
برای آپلود و ذخیره کردن:
http://image.intervention.io/use/uploads

Unique
یک شنبه 17 آبان 1394, 15:37 عصر
صحبت های جناب djtrex عموما درسته اما چند تا موضوع :

۱- قبل از این که شروع به کار کنید باید ببینین توی فرمتون قرار هست چه نوع فایلی را پردازش و ذخیره کنید. مثلا بحث عکس با بحث فیلم یا بحث فایل ها document خیلی متفاوته

۲- کلا باید فایل ها را جایی ذخیره کنید که امکان دسترسی بهش نباشه ، یعنی کسی نتونه آدرس بزنه توی مرورگر و بهش دسترسی داشته باشه ،‌پس یا باید permission های درستی انتخاب کنید یا با htaccess. محدودیت ایجاد کنید یا کلا از wwwroot خارج بشین.

۳- بهتره فایل را با php پردازش و به کاربر برگردونین ، مثلا وقتی شما خودتون header میدین و یک عکس را read میکنید سمت مرورگر ، اصلا دیگه مهم نیست پسوندش چیه ، دوتایی هست ، سه تایی هست ،‌تنظیمات آپاچی چیه ! اگه عکس هم آلوده به اسکریپت مخرب باشه برای شما اتفاقی نمیفته مگه اینکه کد مخرب سمت کلاینت باشه. این در مورد فایل های دیگه هم صادقه و شما همیشه فارغ از مشکلات اجرای کد مخرب از طریق آپاچی خواهید بود.

۴- کپی گرفتن از عکس با gd کلا bad practice نیست اما روش کامل و درستی هم نیست و در کنار رعایت موارد دیگه معتبره.

۵ - اگه خیلی نگران نام فایل و روش های نفوذ هستید میتونین نام اصلی را توی database ذخیره کنید و فایل را با نام کد ردیفش بدون پسوند ذخیره کنین.

در مورد بحث ارسال امن فایل خیلی حرف واسه گفتن هست اما همین ها تا ۹۹ درصد امنیت را تامین میکنه.

باز هم تکرار میکنم باید ببینیم چه فایلی را داریم دریافت میکنیم و چطوری و کجا ازش استفاده میشه.

olampiad
یک شنبه 17 آبان 1394, 17:50 عصر
سلام
تشکر فراوان بابت راهنمایی ها

شما اینجا گفتین :

۲- کلا باید فایل ها را جایی ذخیره کنید که امکان دسترسی بهش نباشه ، یعنی کسی نتونه آدرس بزنه توی مرورگر و بهش دسترسی داشته باشه ،‌پس یا باید permission های درستی انتخاب کنید یا با htaccess. محدودیت ایجاد کنید یا کلا از wwwroot خارج بشین.

به این تصویر ی نگا بندازید.
همونطور که می بینید هر کاربری به راحتی میتونه به فایل های من دسترسی داشته باشه یا فایل های منو ببینه.
من چطوری میتونم کاربر رو برای این کار محدودو کنم.
یعنی کاربر دیگه به این آدرس رفت فایل های منو نبینه یا در کل دسترسی نداشته باشه.
آیا اینو با htaccess انجام بدم یا چی؟
ممنون

http://s6.picofile.com/file/8221678934/why.PNG

olampiad
یک شنبه 17 آبان 1394, 17:54 عصر
من این htacces رو تو پوشه ی تصاویر قرار دادم.
این htaccess باعث میشه که فایل های php داخل این پوشه اجرا نشه.

RemoveHandler .php .phtml .php3
RemoveType .php .phtml .php3
php_flag engine off

حالا من میخوام کلا کاربر فایل هامو نبینه.
برای این کار باید چیکار کنم.
ممنون

Unique
دوشنبه 18 آبان 1394, 01:54 صبح
اینکه apache محتوایت فولدر را نشون میده با اضافه کردن کد زیر توی htaccess. حل میشه ؛

Options -Indexes

اما اگه میخواین دسترسی به یک دایرکتوری را از طریق apache کامل ببندین یک فایل htaccess. توی اون فولدر بسازین و توش فقط بنویسین :

Deny from all

اینطوری توجه کنید که مثلا اگه یک عکس توی این فولدر باشه و بخواین به کاربر نشون بدین نمیتونین آدرسش را توی src بنویسین چون آپاچی اجازه استفاده را به هیچ وجه نمیده ! باید از طریق خود php و ارسال header های مناسب و بعدش محتوای فایل کار را انجام بدین. بحث cache را هم خودتون از طریق etag میتونید انجام بدین. این امن ترین روشه به نظر من.