PDA

View Full Version : سوال: آپلود فایل در php



esteftaats
چهارشنبه 19 شهریور 1393, 13:12 عصر
سلام دوستان

مشکلی که دارم اینه که وقتی که (بعد از کلیک روی submit )در حالیکه عکسی رو برای آپلود انتخاب نکردم پیام خطایی که در خط 11 هستش اجرا میشه یعنی :

فقط فرمت های jpg ، jpeg ، png و gif مورد قبول هستند.

یعنی تابع isset درست کار نمی کنه؟!!!

ممنون


if (isset($_FILES['image1']))
{
$errors1= array();
$file_name1 = $_FILES['image1']['name'];
$file_size1 =$_FILES['image1']['size'];
$file_tmp1 =$_FILES['image1']['tmp_name'];
$file_type1=$_FILES['image1']['type'];
$file_ext1=strtolower(end(explode('.',$_FILES['image1']['name'])));
$expensions= array("jpeg","jpg","png","gif");
if(in_array($file_ext1,$expensions)=== false){
$errors1[]="فقط فرمت های jpg ، jpeg ، png و gif مورد قبول هستند.";
}
if($file_size1 > 2097152){
$errors1[]='فایل مورد نظر بسیار حجیم است.';
}
$query = "select * from slider where img='$file_name1'";
$result = mysqli_query($db, $query);
if (mysqli_num_rows ($result))
{
echo 'the image is exist';
}
else
{
if(empty($errors1)==true)
{
move_uploaded_file($file_tmp1,"images/".$file_name1);
echo "با موفقیت آپلود شد.";
echo 'مسیر فایل مورد نظر عبارتست از : '.'<br />'.'images/'.$file_name1;
}
else
print_r($errors1);
}

DR.HTML
چهارشنبه 19 شهریور 1393, 14:01 عصر
حملات بایپس ؟

esteftaats
چهارشنبه 19 شهریور 1393, 14:48 عصر
کلا هر نوع حمله ای :لبخند:

arash691
چهارشنبه 19 شهریور 1393, 16:28 عصر
دو تا مشکل وجود داره :

1- فایل با این پترن filename.php.jpg رو چک نمیکنی
2- اگر نام فایلی که داره اپلود میشه تو مسیر یا جدول بود این وظیفه ی اسکریپت شماست که تغییر نام روی فایل جدید اعمال بکنه

در مورد هر دو موضوع هم بحث شده تو تاپیک های قدیمی تر

esteftaats
چهارشنبه 19 شهریور 1393, 20:11 عصر
دو تا مشکل وجود داره :

1- فایل با این پترن filename.php.jpg رو چک نمیکنی
2- اگر نام فایلی که داره اپلود میشه تو مسیر یا جدول بود این وظیفه ی اسکریپت شماست که تغییر نام روی فایل جدید اعمال بکنه

در مورد هر دو موضوع هم بحث شده تو تاپیک های قدیمی تر
مورد دوم رو می دونستم اما یادم رفته بود تغییرش بدم.

و اما در مورد مورد اول :

اصلا چنین فایل هایی هم داریم؟!

خوب اگه یه عکس دیگه باشه چی؟

طرز چک کردنش رو هم نتونستم پیدا کنم

hamedarian2009
چهارشنبه 19 شهریور 1393, 21:40 عصر
مورد دوم رو می دونستم اما یادم رفته بود تغییرش بدم.

و اما در مورد مورد اول :

اصلا چنین فایل هایی هم داریم؟!

خوب اگه یه عکس دیگه باشه چی؟

طرز چک کردنش رو هم نتونستم پیدا کنم
بله این روش یک نمونه از حملات از طریق آپلود هست که بهش آپلود شل هم گفته میشه برای جلوگیری ازش هم چنتا راه داری که یکیش اینه بیای فایل با فرمت چندگانه رو به این شکل تبدیل کنی

file-php.jpg
یا اینکه تو پوشه آپلود تصتویر از فایل htaccess با دستورات زیر استفاده کنی تا اجازه اجرای فایل هایی با این فرمت ها رو نده


php_flag engine off
<FilesMatch ".(php|php.*|sphp|php3|php4|php5|phtml|cgi|pl|shtml |dhtml|html|htm|asp|aspx) $">
Deny From All
</FilesMatch>





روش های دیگه ای هم هست و یا اصلا میتونی از یک کلاس آماده آپلود تصویر استفاده کنی که خودش همه این چیزارو لحاظ کرده

DR.HTML
چهارشنبه 19 شهریور 1393, 21:56 عصر
بله این روش یک نمونه از حملات از طریق آپلود هست که بهش آپلود شل هم گفته میشه برای جلوگیری ازش هم چنتا راه داری که یکیش اینه بیای فایل با فرمت چندگانه رو به این شکل تبدیل کنی

file-php.jpg
یا اینکه تو پوشه آپلود تصتویر از فایل htaccess با دستورات زیر استفاده کنی تا اجازه اجرای فایل هایی با این فرمت ها رو نده


php_flag engine off
<FilesMatch ".(php|php.*|sphp|php3|php4|php5|phtml|cgi|pl|shtml |dhtml|html|htm|asp|aspx) $">
Deny From All
</FilesMatch>





روش های دیگه ای هم هست و یا اصلا میتونی از یک کلاس آماده آپلود تصویر استفاده کنی که خودش همه این چیزارو لحاظ کرده

یه مدتی من از روشی که شمما از طریق Deny کردن استفاده میکردم یادمه یکی از دوستان بایپس کرد :لبخند: اما ببهم نگفت
به نظرم به ترین راه همون هش کردن هستش

hamedarian2009
چهارشنبه 19 شهریور 1393, 22:03 عصر
یه مدتی من از روشی که شمما از طریق Deny کردن استفاده میکردم یادمه یکی از دوستان بایپس کرد :لبخند: اما ببهم نگفت
به نظرم به ترین راه همون هش کردن هستش

بله امنیت هیچ وقت 100 درصد نیست و بازم میشه هک کرد . خودم از یه کلاس آپلودر استفاده میکنم که خیلی خوبه و امنیتش در حد قابل قبولیه و کار هرکسی نیست هکش کنه

esteftaats
پنج شنبه 20 شهریور 1393, 01:38 صبح
بله امنیت هیچ وقت 100 درصد نیست و بازم میشه هک کرد . خودم از یه کلاس آپلودر استفاده میکنم که خیلی خوبه و امنیتش در حد قابل قبولیه و کار هرکسی نیست هکش کنه
میشه توی تاپیک بذارینش؟

DR.HTML
پنج شنبه 20 شهریور 1393, 10:27 صبح
همین اپلودر mihalism هم هش میکنه کلا راه امنیه بایپس هم نمیشه ضمنن اینم یه کلاس قویه من دیدمش خوشم اومد اونم Sha میکنه اسمهارو
https://github.com/aivis/PHP-file-upload-class/blob/master/upload.php

esteftaats
پنج شنبه 20 شهریور 1393, 10:31 صبح
پست اول تاپیک بروزرسانی شد (سوال سوم)

esteftaats
پنج شنبه 20 شهریور 1393, 16:39 عصر
کسی بلد نیست؟!

peymang
پنج شنبه 20 شهریور 1393, 17:03 عصر
اگه سرچ می کردی به نتیجه می رسیدی چند روز پیش یه نفر همین سوالو کرده بود( کلا سرچ چیز خوبیه :لبخندساده: )

و اینکه ایندکس type همون mime type هست
یعنی اگه پسوند فایل jpg باشه ایندکس type میشه image/jpeg

mime type (https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types)

و از is_uploade_file یا ایندکس error (http://php.net/manual/en/features.file-upload.errors.php) پس از بررسی isset استفاده کن

esteftaats
پنج شنبه 20 شهریور 1393, 17:31 عصر
اگه سرچ می کردی به نتیجه می رسیدی چند روز پیش یه نفر همین سوالو کرده بود( کلا سرچ چیز خوبیه :لبخندساده: )

و اینکه ایندکس type همون mime type هست
یعنی اگه پسوند فایل jpg باشه ایندکس type میشه image/jpeg

mime type (https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types)

و از is_uploade_file یا ایندکس error (http://php.net/manual/en/features.file-upload.errors.php) پس از بررسی isset استفاده کن
ممنون ازت ولی اینقدر حرفه ای توضیح دادی که من آماتور متوجه نشدم :لبخند:

یعنی بعد از if (isset($_FILES['image1']))

این رو بذارم؟

if(is_uploaded_file($file_name1))

راستش این کد رو از جایی گرفتم و خیلی حرفه ای نیستم. اگه کدی رو که میگی رو توی کدم بذاری ممنون میشم :لبخند:

peymang
پنج شنبه 20 شهریور 1393, 18:30 عصر
داخل خط یک با استفاده از یک and ( اگه ارور نداد :لبخند: )

یا بعد از if خط اول
اینجوری







if ($_FILES['image1']['error'] == UPLOAD_ERR_OK) {

//...

}

esteftaats
پنج شنبه 20 شهریور 1393, 18:49 عصر
داخل خط یک با استفاده از یک and ( اگه ارور نداد :لبخند: )

یا بعد از if خط اول
اینجوری







if ($_FILES['image1']['error'] == UPLOAD_ERR_OK) {

//...

}


باورم نمیشه :متعجب:

درست شد.

مرسی ازت :قلب: