نیازمند یک راهکار ! گیر کردم !

jigartalaa

Member
سلام ! خوبید ؟
اساتید محترم ! همونطور که میدونید دارم یک سیستم مینویسم ... { بگذریم } اما به یک مشکل برخوردم !
اونم تو آپلود فایل هست ! من کامل با دستور زیر میتونم فایل رو آپلود کنم و اینکار هم انجام میدم !
PHP:
    if($_FILES['aksk']['name']!='') 
   {
    move_uploaded_file($_FILES['aksk']['tmp_name'],'../../upload/mahsoolat/'. basename( $_FILES['aksk']['name']));
    $aksk='./upload/'. basename( $_FILES['aksk']['name']);
   }else{
   $aksk='aks/no.jpg';
   }

خوب حالا برای اینکه دسترسی آپلود به بعضی از فایل ها رو ببندم مثلاً فقط محدودیت آپلود فایل های تصویری رو بذارم از کد زیر استفاده کردم !

PHP:
<?php

$file = $_FILES['userfile'];

$allowedExtensions = array("txt", "rtf", "doc");

function isAllowedExtension($fileName) {
  global $allowedExtensions;

  return in_array(end(explode(".", $fileName)), $allowedExtensions);
}

if($file['error'] == UPLOAD_ERR_OK) {
  if(isAllowedExtension($file['name'])) {
    # Do uploading here
  } else {
    echo "Invalid file type";
  }
} else die("Cannot upload");

?>


ولی با این حال میشه این راه حل رو دور زد ! بطوریکه شما یک Sh3ll آپلود میتونی کنی ! در کد بالا دسترسی آپلود برای فایل های txt . rtf . doc هست ! اما اگر شما sh3ll خودتون رو با نام test.php.txt آپلود کنید فایل نیز آپلود میشه و sh3ll هم اجرا میشه ! کسی راهکار بهتری بلده به ما هم بگه ؟
محدودیت حجمی هم درست کردم ! اما sh3ll هایی هستن رو اینترنت که تنها 30 کیلوبایت هستن !
 

jigartalaa

Member
یک راه دیگه هم هست ! اما اینم میشه دور زد مثل اولی دوستان یک کمکی بکنید !

PHP:
$supportFileType = array(
 'png', 'jpg', 'gif', 'jpeg', 'bmp', 'tif',
 'doc', 'docx', 'xls',
 'mp3', 'wav', 'mid',
 'zip', 'rar', '7zip',
 'swf'
);
if($upload['error'] == 0) {
 
 $info  = pathinfo($upload['name']);
 
 if(in_array(strtolower($info['extension']), $supportFileType)) {
  $upload_name = getFileName( basename($upload['name']) );

اما همچنان اینم با روش اولی دور زده میشه ! چندین راه امتحان کردم همشون اینطوری هستن !
 

D.A.V.O.O.D

Member
سلام احسان جان ،
بهترین و درست ترین کار اینه که توسط :
PHP:
$FileType = $_FILES['aksk']['type'];
و بعد مثلا اینارو مجاز کنی :
PHP:
$AllowType = array( "image/png" , "image/gif" );

بعد قبل آپلود اینکار رو کنی :

PHP:
if( in_array( $FileType , $AllowType ) )
{

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

موفق باشی دوست قدیمی :oops:
 

D.A.V.O.O.D

Member
از طریق این روش که گفتم اینا هم بدردت می خوره :

PHP:
'txt' => 'text/plain',
'htm' => 'text/html',
'html' => 'text/html',
'php' => 'text/html',
'css' => 'text/css',
'js' => 'application/javascript',
'json' => 'application/json',
'xml' => 'application/xml',
'swf' => 'application/x-shockwave-flash',
'flv' => 'video/x-flv',

// images
'png' => 'image/png',
'jpe' => 'image/jpeg',
'jpeg' => 'image/jpeg',
'jpg' => 'image/jpeg',
'gif' => 'image/gif',
'bmp' => 'image/bmp',
'ico' => 'image/vnd.microsoft.icon',
'tiff' => 'image/tiff',
'tif' => 'image/tiff',
'svg' => 'image/svg+xml',
'svgz' => 'image/svg+xml',

// archives
'zip' => 'application/zip',
'rar' => 'application/x-rar-compressed',
'exe' => 'application/x-msdownload',
'msi' => 'application/x-msdownload',
'cab' => 'application/vnd.ms-cab-compressed',

// audio/video
'mp3' => 'audio/mpeg',
'qt' => 'video/quicktime',
'mov' => 'video/quicktime',

// adobe
'pdf' => 'application/pdf',
'psd' => 'image/vnd.adobe.photoshop',
'ai' => 'application/postscript',
'eps' => 'application/postscript',
'ps' => 'application/postscript',

// ms office
'doc' => 'application/msword',
'rtf' => 'application/rtf',
'xls' => 'application/vnd.ms-excel',
'ppt' => 'application/vnd.ms-powerpoint',

// open office
'odt' => 'application/vnd.oasis.opendocument.text',
'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
 

parsiteam

Member
راهی که داوود گفته دقیق ترین راهه و در واقع بجای چک کردن پسوند فایل Header فایل رو بررسی میکنی . یک راه دیگه هم اینه که چک کنی نام فایل فقط یک نقطه داشته باشه . مثلا sasan.php.txt رو خطا بیگره . به نظرم راه دوم هم خوب باشه . از همه بهتر اینه که هر سه تا رو چک کنی :دی
 

D.A.V.O.O.D

Member
البته من گم هرچی که دوست داره را کاربر rename کنه مثلا آخرش یه txt بزنه و آپلودش کنه ، وقتی نمی تونه فایل رو بعد آپلود rename کنه ، خوب مگه چه ضرری داره ؟ الان دیگه مثلا فایل php شده txt و روی سرور به عنوان یک فایل txt شناخته میشه و عمل نمی کنه دیگه !

درست نمی گم ؟
 

jigartalaa

Member
سلام از هر 2 دوست بزرگوار ممنونم !
من خودم مشکلم رو حل کردم اومدم از نوشتن کد زیر استفاده کردم !

PHP:
$maxsize=102410; // 100 KB
$target1='';if(@$_FILES['mypic']['name']){@$target1 = $target0 .strtolower(substr(basename($_FILES['mypic']['name']),-4));}
if(((@$_FILES['mypic']['size'] < $maxsize) AND (@$_FILES['mypic']['type']=="image/jpeg" OR @$_FILES['mypic']['type']=="image/pjpeg" OR @$_FILES['mypic']['type']=="image/gif")) OR @$_FILES['mypic']['name']==''){

حالا دارم رو 2 مبحث کار میکنم برای امنیت بیشتر !
1 . اینکه فایل بعد از آپلود تبدیل بشه به یک فایل و خروجی بده ! مثلاً jpg تبدیل بشه به PNG یا هر فایل دیگه ای ! { اگه کلاسی میشناسید معرفی کنید }

2 . خروجی عکس به این صورت باشه با blob مستقیم تو دیتابیس عکس ذخیره شه ! بعدش شماره گذاری شه با آیدی مثلاً img.php?id=12 . شما کدوم پیشنهاد میدید !؟ تو این روش دومی آدرس عکس به هر صورت اینطوری و خروجی پی اچ پی نمیتونه بگیره !

موفق باشید !
 

jigartalaa

Member
درسته داوود جان دیگه اجرا نمیگیره ! اما خوب بازم کسی که اینکاره باشه میتونه تغییر بده ! فقط کافیه یه injection SQLer گیر بیاره بعد بره اونجا با یه سری Command Linux اینکارو انجام بده !
 

parsiteam

Member
سلام از هر 2 دوست بزرگوار ممنونم !
من خودم مشکلم رو حل کردم اومدم از نوشتن کد زیر استفاده کردم !

PHP:
$maxsize=102410; // 100 KB
$target1='';if(@$_FILES['mypic']['name']){@$target1 = $target0 .strtolower(substr(basename($_FILES['mypic']['name']),-4));}
if(((@$_FILES['mypic']['size'] < $maxsize) AND (@$_FILES['mypic']['type']=="image/jpeg" OR @$_FILES['mypic']['type']=="image/pjpeg" OR @$_FILES['mypic']['type']=="image/gif")) OR @$_FILES['mypic']['name']==''){

حالا دارم رو 2 مبحث کار میکنم برای امنیت بیشتر !
1 . اینکه فایل بعد از آپلود تبدیل بشه به یک فایل و خروجی بده ! مثلاً jpg تبدیل بشه به PNG یا هر فایل دیگه ای ! { اگه کلاسی میشناسید معرفی کنید }

2 . خروجی عکس به این صورت باشه با blob مستقیم تو دیتابیس عکس ذخیره شه ! بعدش شماره گذاری شه با آیدی مثلاً img.php?id=12 . شما کدوم پیشنهاد میدید !؟ تو این روش دومی آدرس عکس به هر صورت اینطوری و خروجی پی اچ پی نمیتونه بگیره !

موفق باشید !
خواهش میکنم . وظیفه بود .

1 . اول جواب 2 رو بخون متوجه جواب 1 میشی :دی

2 . به نظر من ذخیره دی دیتابیس خیلی خوبه . نمیگم بهترینه ولی میگم خیلی خوبه . الان tinypic روی دیتابیس میزاره . آواکده هم دیتابیسه . دلیلش اینه که اگر تعداد فایلا زیاد بشن روی سرور سرعت لود سرور رو خیلی کم میکنن ولی یک کوئری د حد صدم ثانیه طول میکشه تا دیتا رو بیاره و نشون بده . بعدشن بکاپ گرفتنش خیلی سادست . کافیه بکاپ دیتابیس بگیری . حالا برای ذخیره توی دیتابیس دیگه پسوند مهم نیست . اینم جواب 1 :دی
 

jigartalaa

Member
سلام ساسان جان ! از پاسخت ممنونم ! این مسئله رو میدونم قربونت بشم ! برای همین گفتم شما کدوم رو پیشنهاد میکنید ! راه 1 و راه 2 ! سرعت لود حالا زیاد فرقی نداره با هم ! چرا که اطلاعات بالاخره توی دیتا بیس ثبت میشه ! برای امنیت به نظرت چطوره ! میخوام امنیت بالا باشه ! حالا حتی اگه sh3ll هم آپلود شه ! میاد با دستورات بررسی میکنه اگر فایل تصویری نبود نمایش داده نمیشه و بصورت مستقیم به فایل دسترسی نداره ! به این صورت که img.php?id=id خوب در واقع اینطوری کسی که sh3ll آپلود میکنه نمیدونم آدرس مستقیم کجاست و در img.php هم کد نوشته میشه اگه فایل ... نبود نمایش نده !حالا میخوام بدونم به نظرت راه تغییر نام فایل و تبدیل بهتره یا این راه ؟
 

جدیدترین ارسال ها

بالا