جلوگیری از حذف فایلهای ناخواسته توسط اسکریپتهایی که خودمون می نویسیم

phpweb

Active Member
من توی سرور یه پوشه ایجاد کردم و همه فایلهایی که کاربر ارسال می کنه رو توی این پوشه قرار می دم.

قابلیت حذف فایلهای دلخواه رو هم به این سیستم آپلود فایل اضافه کردم. از طریق آرایه گت آدرس فایلها و پوشه هایی که باید حذف بشن رو برای اسکریپت می فرستم.

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

چطور باید تشخیص بدم که آدرس مورد نظر برای حذف یه فایل خارج از پوشه آپلود هست؟ با توابعی مثل is_file, is_dir نمی شه جلوی این کار رو گرفت.

ساختار پوشه های به این شکل هست.

PHP:
/admin
. 
..
up
 

masima

Member
1) این پوشه ها رو تو فایل config به صورت const تعریف کنید و به جای آدرس واقعی نام این متغیرهای ثابت رو تو url بفرستید 2) بعدشم با یک دستور if پیش از اینکه هر گونه عمل پاک کردن رو انجام بدین بررسی کنید ببینید همون پوشه هست یا نه 3) مهمتر از همه ، به جای get از post استفاده کنید امیدوارم کمک کرده باشم
 

phpweb

Active Member
1) این پوشه ها رو تو فایل config به صورت const تعریف کنید و به جای آدرس واقعی نام این متغیرهای ثابت رو تو url بفرستید 2) بعدشم با یک دستور if پیش از اینکه هر گونه عمل پاک کردن رو انجام بدین بررسی کنید ببینید همون پوشه هست یا نه 3) مهمتر از همه ، به جای get از post استفاده کنید امیدوارم کمک کرده باشم
از post که نمی شه استفاده کرد. چون من فرم ارسال نمی کنم و فقط با کلیک کردن کاربر روی یه دکمه، فایل حذف می شه.

منظورتون از " این پوشه ها رو تو فایل config به صورت const تعریف کنید" چیه؟ من یه پوشه دارم که فایلهاتوش آپلود می شن.امکان ایجاد پوشههای اضافه توی پوشه وجود داره. در نتیجه یه پوشه نیست که بخوام اون رو توی فایل config تعریف کنم.
 

masima

Member
1)
من یه پوشه دارم که فایلهاتوش آپلود می شن.امکان ایجاد پوشههای اضافه توی پوشه وجود داره. در نتیجه یه پوشه نیست که بخوام اون رو توی فایل config تعریف کنم.
خب یعنی می خواین بگین پوشه ها به صورت پویا زیاد میشن و شما هیچ مدیریتی روی نام پوشه های ایجاد شده ؛ ندارید؟
اگه تعیین نام پوشه ها با شماست و حتی اگه تعداد پوشه ها زیاد باشه شما بازهم میتونید از این روش استفاده کنید ولی خوب تعداد const هاتون زیاد میشه.

2) روی مورد دوم فک کنم بتونید خیلی مانور بدین ، منظورم اینه که هر کاربر باید فقط پوشه های خودشو بتونه پاک کنه درسته؟ پس امنیت و دسترسی رو پیش از پاک کردن پوشه ها چک کنید
--------------------------------------------------------------------------------------------------------------------------------------------
و در کنار همه اینا روش زیر حتما میتونه مفید باشه :
یه روش دیگه هم هست و اون همون تنظیم های فایل htaccess هست که شما برای کاربراتون تعریف میکنید که بتونن به پوشه خاصی دسترسی داشته باشن یا نه!
 

masima

Member
یه موردی الان به فکرم رسید :
چرا از فرم استفاده نمیکنید؟
به نظرم خیلی راحتتر میشه، اگه دکمه حذف رو بذارید توی فرم و همینطور یک فیلد hidden که مقدار value اون رو آدرس پوشه (فایل) قرار بدین بعدش همین دیگه میشه از post استفاده کرد دیگه!
 

phpweb

Active Member
یه موردی الان به فکرم رسید :
چرا از فرم استفاده نمیکنید؟
به نظرم خیلی راحتتر میشه، اگه دکمه حذف رو بذارید توی فرم و همینطور یک فیلد hidden که مقدار value اون رو آدرس پوشه (فایل) قرار بدین بعدش همین دیگه میشه از post استفاده کرد دیگه!
نمی شه از این روش استفاده کنم.

برای اینکار باید توی سورس و ظاهر سایت دست ببرم و وقت اینکار رو ندارم.
 

Domanjiri

Well-Known Member
سلام
ابتدا راجع به اینکه گفتید:
از post که نمی شه استفاده کرد. چون من فرم ارسال نمی کنم و فقط با کلیک کردن کاربر روی یه دکمه، فایل حذف می شه.
باید عرض کنم که توی ارسال ئرخواست ها به صورت AJAX هم میشه از متد post استفاده کرد.

و اما سوال: خب بهترین راه اینه که چک کنید ببینید آدرس دریافتی مربوط به اون پوشه خاص هست یا نه (منظورتون نکنه چیز دیگه ایه؟)

فرض کنید اسم پوشه مورد نظر upload_dir باشه و به هر حال شما یه جایی توی برنامه به آدرسی که میاد دسترسی دارید دیگه، پس:
PHP:
<?php

/**
 * @author Domanjiri
 * @date 2011
 */
$path = 'upload_dir/_salamghjs/0sg/f/sdfgasfd_h54sd.MP3'; 		//match
/**
$path = '/upload_dir/d5.txt';                   				 //Dont match
$path = 'upload_dir2/f/sdfgasfd_h54sd.MP3';      			//Dont match
$path = 'upload_dir/_salamghjs/0sg/f/.png';     			 //Dont match
$path = 'upload_dir/_salamghjs/0sg/f/sdf';       			//Dont match
$path = 'upload_dir//sdf.txt';      					 //Dont match
....
...
..
.
**/

if (preg_match('/(^upload_dir\\/)([a-zA-Z_0-9]+\\/)*([a-zA-Z_0-9])+\.(txt|jpg|png|mp3|gif|dat)$/i',$path)){
    echo 'match!';
} else {
    echo 'Dont match!';
}


?>

اگه خواستید می تونید مشخص کنید که تا چند لایه دایرکتوری قابل قبول هست یا .....

موفق باشید
 

phpweb

Active Member
سلام
ابتدا راجع به اینکه گفتید:

باید عرض کنم که توی ارسال ئرخواست ها به صورت AJAX هم میشه از متد post استفاده کرد.

و اما سوال: خب بهترین راه اینه که چک کنید ببینید آدرس دریافتی مربوط به اون پوشه خاص هست یا نه (منظورتون نکنه چیز دیگه ایه؟)

فرض کنید اسم پوشه مورد نظر upload_dir باشه و به هر حال شما یه جایی توی برنامه به آدرسی که میاد دسترسی دارید دیگه، پس:
PHP:
<?php

/**
 * @author Domanjiri
 * @date 2011
 */
$path = 'upload_dir/_salamghjs/0sg/f/sdfgasfd_h54sd.MP3';         //match
/**
$path = '/upload_dir/d5.txt';                                    //Dont match
$path = 'upload_dir2/f/sdfgasfd_h54sd.MP3';                  //Dont match
$path = 'upload_dir/_salamghjs/0sg/f/.png';                  //Dont match
$path = 'upload_dir/_salamghjs/0sg/f/sdf';                   //Dont match
$path = 'upload_dir//sdf.txt';                           //Dont match
....
...
..
.
**/

if (preg_match('/(^upload_dir\\/)([a-zA-Z_0-9]+\\/)*([a-zA-Z_0-9])+\.(txt|jpg|png|mp3|gif|dat)$/i',$path)){
    echo 'match!';
} else {
    echo 'Dont match!';
}


?>
اگه خواستید می تونید مشخص کنید که تا چند لایه دایرکتوری قابل قبول هست یا .....

موفق باشید

مشکل رو با تابع preg_match حل کردم.
 

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

بالا