PDA

View Full Version : سوال: عدم کارکرد file name extention



h.rezaee
جمعه 21 تیر 1392, 12:15 عصر
سلام . بنده برای جلوگیری از شل آپلود دارم فایلی رو که توسط کاربر وارد میشه برای آپلود رو از چند فیلترینگ عبور میدم. یکی از این فیلترینگ ها file name extention هستش که یک لیست سیاهی داره که در صورتی که نام فایل دارای همچین عباراتی بود امکان آپلود رو به کاربر (هکر) نده ، منتها نمی دونم چرا درست کار نمی کنه ، حدس بنده اینه که regular expertion درست کار نمیکنه . ممنون میشم اگه شما بزرگواران هم نگاهی به این کد بندازید و بنده رو راهنمایی کنید.


$blacklist = array(".php", ".phtml", ".php3", ".php4");
foreach ($blacklist as $item) {
if(preg_match("/$item\$/i", $_FILES['userfile']['name'])) {
echo "We do not allow uploading PHP files\n";
exit;
}
}
$uploaddir = 'uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "File is valid, and was successfully uploaded.\n";
} else {
echo "File uploading failed.\n";
}

sh.n.n786
جمعه 21 تیر 1392, 20:22 عصر
درود
این روش خوبه اما درگیری های زیادی داره بهینه تر هم میشه نوشت مثالا از class های spl استفاده کنید در ضمن شما باید فرمت فایلو بخونید لیست سیاه درست نکنید از لیست سفید استفاده کنید از قصد دارید که فقط عکس آپلود بشه باید پسوند های که مد نطرتون هستو قرار بدید ( لیست سیاه هیچ وقت کامل نمیشه اما سفید دست خودمونه )
نمونه (عکس) : از getimagesize() استفاده کنید شرح کامل یک عکس رو به شما میده
نمونه (فایل) :




$info = new SplFileInfo('foo.txt');
var_dump($info->getExtension());
خروجی :
string(3) "txt"
$info = new SplFileInfo('photo.jpg');
var_dump($info->getExtension());
خروجی :
string(3) "jpg"
$info = new SplFileInfo('something.tar.gz');
var_dump($info->getExtension());
خروجی :
string(2) "gz"
منبع حتما مطالعه کنید : http://www.php.net/manual/en/class.splfileinfo.php
در نظرداشته باشید با روش های شما اگه پسوندی " php " باشه و تغیر پیدا کنه به " jpeg " اون فایل اجرا میشه اما با این روش نه چون , سورس اطلاعات اول چک میشه که آیا این عکس هست یا نه ؟
اگه سوالی بود در خدمتیم
موفق باشید

h.rezaee
جمعه 21 تیر 1392, 22:38 عصر
ممنون دوست عزیز . در تاپیک بالا گفتم از چنتا فیلترینگ عبور میدم که یکی از اونا همینه که درست کار نمیکنه . این چیز هایی رو که گفتید رو میدونم و ازش استفاده میکنم.
ببینید با این کد در صورتی که درون اسم فایل ، هر چیزی که در لیست سیاه باشه وجود داشته باشه امکان آپلود نمیده ، برای مثال test.php.jpg که چون درون آن php. هستش امکان آپلود بهش رو نمیده .
فکر کنم شما بزرگوار اشتباه متوجه شدید.
این چیزی که شما گفتید رو باید با استفاده از همون getimagesize حل کرد چون اینجوری دیگه هکر نمیتونه header رو ( البته در صورتی که ما از روش مبتدی ، شاید هم اولیه تشخیص پسوند فایل استفاده کنیم ) دور بزنه.

sh.n.n786
شنبه 22 تیر 1392, 08:44 صبح
درود و ...
بله درسته اگه شما قصد آپلود فایل عکس رو دارید getimagesize بهترین گزینه هست چون الگریتم فایل های عکسو تشخیص میده و به هیچ نحوی نمیتونه عوض کنه .
موفق باشی

h.rezaee
شنبه 22 تیر 1392, 12:11 عصر
از دوستان عزیز کسی دیگه نیست بتونه بنده رو راهنمایی کنه؟

h.rezaee
شنبه 22 تیر 1392, 21:52 عصر
از دوستان بزرگواری همچون اقای شهرکی، اقا مهرداد، آقا رضا قربانی،eshpilesh "اگه درست نوشته باشم " و بقیه دوستان که حضور ذهن ندارم بگم خواهشمندم بنده رو راهنمایی کنید

AliRezaPro
شنبه 22 تیر 1392, 22:09 عصر
همچین چیزی به کارتون نمیاد ؟

https://github.com/emposha/PHP-Shell-Detector
به این جا هم نگاه بندازید

http://hungred.com/useful-information/secure-file-upload-check-list-php/
بهتر نیست ما هم سمت سرور و هم سمت کلاینت با جاوا اسکریپت همچین چیزی رو چک کنیم ؟

h.rezaee
شنبه 22 تیر 1392, 22:56 عصر
همچین چیزی به کارتون نمیاد ؟

https://github.com/emposha/PHP-Shell-Detector
به این جا هم نگاه بندازید

http://hungred.com/useful-information/secure-file-upload-check-list-php/
بهتر نیست ما هم سمت سرور و هم سمت کلاینت با جاوا اسکریپت همچین چیزی رو چک کنیم ؟
ممنون دوست عزیز ، بنده از jQuery /ajax برای این کار استفاده می کنم. باز هم این مطالب بیان شده رو بررسی می کنم.