PDA

View Full Version : سوال: سطح دسترسی include



yeksib
چهارشنبه 11 بهمن 1391, 22:02 عصر
سلام من چه طور میتونم سطح دسترسی صفحات php رو طوری قرار دهم تا کس دیگه ای نتونه اون ها رو به صفحات خودش include کنه!؟(منظور همون صفحات حاوی دیتابیس و کلاس ها)
مثلا ما یک صفحه داریم class.one.php که داخلش کلی کلاس پسورد و خیلی چیز هایی دیگه تعریف شده حالا یکی اگه آدرس این رو پیدا کنه و توی صفحه php سایت خودش include کنه حالا با فرض اینکه اسم کلاس ها رو بدونه میتونه از اون کلاس ها اجرا بگیره !؟ یعنی میتونه کلاس ها رو new کنه و یا متغییر هایی که define براشون تعرف شده رو بازخوانی کنه!؟

habibvafapour
چهارشنبه 11 بهمن 1391, 22:07 عصر
میتونی درون اون کلاس ها از تابع header استفاده کنی تا کسی نتونه سورس کد شما رو در دست بگیره
البته اگر دوستان دیگر راه حل بهتری دارن بفرمایند.

MMSHFE
چهارشنبه 11 بهمن 1391, 22:18 عصر
راه حل که زیاده. مثلاً میتونید توی فایلهایی که میخواین اجازه بدین این کلاس رو include کنن، یک متغیر Session بسازین و اول فایل class.one.php خودتون وجود اون سشن رو چک کنید و اگه نبود، با exit از اسکریپت خارج بشین. میشه بجای سشن، از تعریف ثابت استفاده کرد. میشه کد امنیتی گذاشت، میشه Referer رو بررسی کرد. کلاً راه حل زیاده و فقط کمی خلاقیت و ابتکار و البته حوصله میخواد که بگردین و مناسبترین راه رو برای خودتون پیدا کنید.

yeksib
چهارشنبه 11 بهمن 1391, 22:28 عصر
راه حل که زیاده. مثلاً میتونید توی فایلهایی که میخواین اجازه بدین این کلاس رو include کنن، یک متغیر Session بسازین و اول فایل class.one.php خودتون وجود اون سشن رو چک کنید و اگه نبود، با exit از اسکریپت خارج بشین. میشه بجای سشن، از تعریف ثابت استفاده کرد. میشه کد امنیتی گذاشت، میشه Referer رو بررسی کرد. کلاً راه حل زیاده و فقط کمی خلاقیت و ابتکار و البته حوصله میخواد که بگردین و مناسبترین راه رو برای خودتون پیدا کنید.
حالا میشه یکی دوتا از بهترین روش ها رو توضیح بدید!؟خیلی ازتون ممنون میشم آقای مدیر!

mamali-mohammad
چهارشنبه 11 بهمن 1391, 22:28 عصر
سطح دسترسی فایل رو read برای user بزار
غیر از هاست خودت کسی دیگه نمیتونه بخونه

yeksib
چهارشنبه 11 بهمن 1391, 22:35 عصر
سطح دسترسی فایل رو read برای user بزار
غیر از هاست خودت کسی دیگه نمیتونه بخونه

چطور این کار رو انجام بدم؟ از توی هاست با تغییر chmod ها؟!

MMSHFE
چهارشنبه 11 بهمن 1391, 22:38 عصر
یکیش رو که دوستمون اشاره کردن (سطح دسترسی فایل رو روی 600 یا -------rw- بگذارین). یک روش دیگه، تعیین کد امنیتی هست. مثلاً توی فایلهایی که قراره اسکریپت شما رو include کنن و مجاز هستن و خودتون نوشتین، این کد رو قبل از include کردن بگذارین:

if(!defined('INCLUDE_KEY')) { define('INCLUDE_KEY', 'f19ff947d0f15fb59b22acbaef8e204a'); }
و توی فایل class.one.php (یا هر فایل دیگه که میخواین include اون، کنترل شده باشه، این کد رو قبل از هر کد دیگه بنویسید:


if(!defined('INCLUDE_KEY') || INCLUDE_KEY != 'f19ff947d0f15fb59b22acbaef8e204a') {
die('Unauthorized access.');
}

yeksib
چهارشنبه 11 بهمن 1391, 23:21 عصر
یکیش رو که دوستمون اشاره کردن (سطح دسترسی فایل رو روی 600 یا -------rw- بگذارین). یک روش دیگه، تعیین کد امنیتی هست. مثلاً توی فایلهایی که قراره اسکریپت شما رو include کنن و مجاز هستن و خودتون نوشتین، این کد رو قبل از include کردن بگذارین:

if(!defined('INCLUDE_KEY')) { define('INCLUDE_KEY', 'f19ff947d0f15fb59b22acbaef8e204a'); }
و توی فایل class.one.php (یا هر فایل دیگه که میخواین include اون، کنترل شده باشه، این کد رو قبل از هر کد دیگه بنویسید:


if(!defined('INCLUDE_KEY') || INCLUDE_KEY != 'f19ff947d0f15fb59b22acbaef8e204a') {
die('Unauthorized access.');
}


یه سوالی برام پیش اومد اول اینکه اون قطعه کد اول میاد یک مقدار به INCLUDE_KEY میده وتوی صفحه ی مورد نظر میاد چک میکنه ببینه
INCLUDE_KEY ست شده یا نه اگه نشده بود اجازه دسترسی رو نمیده درسته!؟ اما خوب هکر میتونه بیاد اول صفحه index که داره define ست میشه رو include کنه و بعدش صفحه ی class.one.php که فکر میکنم راحت بتونه این شرط رو دور بزنه! آیا این فرضیات من درسته؟
و دوم این راهکار اولتون هم به تنهایی جواب میده یعنی قرار دادن دسترسی فایل ها برروی 600

MMSHFE
چهارشنبه 11 بهمن 1391, 23:34 عصر
اولاً که اگه هکر اینقدر اطلاعات از سیستم شما داشته باشه که بدونه باید اول index.php رو include کنه (که منطقی نیست چون کلی کد اضافه دریافت میکنه و معمولاً هم سرورها اجازه Remote Inclusion نمیدن)، دیگه نیازی به این همه کارهای پیچیده نداره. ثانیاً شما میتونید با ترکیب این روش و چک کردن ['SERVER['HTTP_REFERER_$ امنیتش رو بالاتر ببرین. بعلاوه فکر نمیکنم سرورها اینقدر بی در و پیکر باشن که کسی بتونه کلاس شما رو include کنه و بعد هم بخواد اونها رو Override کنه. حتی اگه بتونه include کنه، باز هم خروجی رو نمیبینه (اسم کلاسها و... رو) مگه اینکه خودتون با echo اونها رو لو داده باشین.

yeksib
چهارشنبه 11 بهمن 1391, 23:44 عصر
اولاً که اگه هکر اینقدر اطلاعات از سیستم شما داشته باشه که بدونه باید اول index.php رو include کنه (که منطقی نیست چون کلی کد اضافه دریافت میکنه و معمولاً هم سرورها اجازه Remote Inclusion نمیدن)، دیگه نیازی به این همه کارهای پیچیده نداره. ثانیاً شما میتونید با ترکیب این روش و چک کردن ['SERVER['HTTP_REFERER_$ امنیتش رو بالاتر ببرین. بعلاوه فکر نمیکنم سرورها اینقدر بی در و پیکر باشن که کسی بتونه کلاس شما رو include کنه و بعد هم بخواد اونها رو Override کنه. حتی اگه بتونه include کنه، باز هم خروجی رو نمیبینه (اسم کلاسها و... رو) مگه اینکه خودتون با echo اونها رو لو داده باشین.
دو سوال : یکی اینکه شما با این چطوری کار میکنید $_SERVER['HTTP_REFERER']
دوم بااین دستور میشه محتویات رو کشید بیرون؟
echo htmlspecialchars(file_get_contents('class.one.php' ));

2undercover
پنج شنبه 12 بهمن 1391, 06:07 صبح
دو سوال : یکی اینکه شما با این چطوری کار میکنید $_SERVER['HTTP_REFERER']
دوم بااین دستور میشه محتویات رو کشید بیرون؟
echo htmlspecialchars(file_get_contents('class.one.php' ));

سوال 1: با این آرایه گلوبال می تونید ارجاع دهنده به صفحه رو بفهمید مثلا اگه یکی با لینک جستجوی گوگل وارد سایت شما بشه می تونید متوجه بشید!

سوال 2: خیر! اصلا به هیچ وجه هیچ کس نمی تونه کد های PHP رو توی یک سرور ببینه (مگر این که سرور رو هک کنه که این دیگه دست شما نیست که کاری کنید!!!) با این کد هم فقط کد های اجرا شده (یعنی همون خروجی HTML) بدست میاد!

eshpilen
پنج شنبه 12 بهمن 1391, 17:57 عصر
سلام من چه طور میتونم سطح دسترسی صفحات php رو طوری قرار دهم تا کس دیگه ای نتونه اون ها رو به صفحات خودش include کنه!؟(منظور همون صفحات حاوی دیتابیس و کلاس ها)
مثلا ما یک صفحه داریم class.one.php که داخلش کلی کلاس پسورد و خیلی چیز هایی دیگه تعریف شده حالا یکی اگه آدرس این رو پیدا کنه و توی صفحه php سایت خودش include کنه حالا با فرض اینکه اسم کلاس ها رو بدونه میتونه از اون کلاس ها اجرا بگیره !؟ یعنی میتونه کلاس ها رو new کنه و یا متغییر هایی که define براشون تعرف شده رو بازخوانی کنه!؟
ها ها مگه کشکه؟ :متفکر:
منظورت اینه کلا روی یه هاست دیگه باشه و بیاد فایلهای شما رو ریموت اینکلود کنه؟
تاجاییکه به عقل من میرسه، اگر پسوند فایلهای اینکلودی شما php باشه، طرف نمیتونه اونا رو اینکلود کنه. نهایت فقط خروجی اونا (درصورت وجود) رو بدست میاره. اونم تازه با یک شرط ساده که اصولا هم ابتدای فایلها میذارید تا کسی مستقیما اونا رو اجرا نکنه، جلوش گرفته میشه.
شاید یک دلیل اینکه میگن پسوند فایلهای اینکلودی رو غیر از php نذارید همین باشه!
ضمنا شما توی htaccess در دایرکتوری فایلهای اینکلود هم این دستور رو بذار:

deny from all
اینطور حتی اگر پسوند php نباشه بازم کسی نمیتونه ریموت اینکلود کنه.

درسته آقای شهرکی؟

MMSHFE
جمعه 13 بهمن 1391, 06:44 صبح
درسته. با دستوراتی مثل file_get_contents و... فقط نتیجه اجرای اسکریپت PHP برگردونده میشه و سورس کدش تحویل داده نمیشه. اما باز هم راههای مطمئنتری رو میتونید اضافه کنید. مثلاً کد htaccess. زیر رو ببینید:


# If the next line is already in your .htaccess, you don't need to add a 2nd one.
RewriteEngine On
RewriteCond %{QUERY_STRING} =(ht|f)tp\:// [NC]
# Allow yourself, for SMF Forum Package Manager upgrades.
# Set it to your own IP address so you are the only one who won't be blocked.
#RewriteCond %{REMOTE_ADDR} !^111\.222\.333\.444$ [NC]
RewriteRule .* - [F]

البته بجای 111.222.333.444 آدرس IP واقعی هاست خودتون رو بگذارین. اینطوری دسترسی به فایلها فقط ازطریق سرور خودتون امکان پذیر میشه. درسته توی هاست اشتراکی یکم ریسک داره ولی بازهم جلوی خیلی از حملات RFI که ازطرف سایر هاستها اعمال میشه رو میگیره. اگه هاست اختصاصی داشته باشین هم که کلاً امنیت رو تأمین میکنه.

yeksib
جمعه 13 بهمن 1391, 10:36 صبح
درسته. با دستوراتی مثل file_get_contents و... فقط نتیجه اجرای اسکریپت PHP برگردونده میشه و سورس کدش تحویل داده نمیشه. اما باز هم راههای مطمئنتری رو میتونید اضافه کنید. مثلاً کد htaccess. زیر رو ببینید:


# If the next line is already in your .htaccess, you don't need to add a 2nd one.
RewriteEngine On
RewriteCond %{QUERY_STRING} =(ht|f)tp\:// [NC]
# Allow yourself, for SMF Forum Package Manager upgrades.
# Set it to your own IP address so you are the only one who won't be blocked.
#RewriteCond %{REMOTE_ADDR} !^111\.222\.333\.444$ [NC]
RewriteRule .* - [F]

البته بجای 111.222.333.444 آدرس IP واقعی هاست خودتون رو بگذارین. اینطوری دسترسی به فایلها فقط ازطریق سرور خودتون امکان پذیر میشه. درسته توی هاست اشتراکی یکم ریسک داره ولی بازهم جلوی خیلی از حملات RFI که ازطرف سایر هاستها اعمال میشه رو میگیره. اگه هاست اختصاصی داشته باشین هم که کلاً امنیت رو تأمین میکنه.

خوب توی هاست اشتراکی چه ریسکی داره؟

MMSHFE
جمعه 13 بهمن 1391, 13:53 عصر
خوب توی هاست اشتراکی اگه یک سایت دیگه که روی همون هاست هست، بخواد وارد بشه، جلوی نفوذ رو نمیگیره چون IP اون با مال شما یکیه. البته اگه RewriteCond دوم رو مشابه کدی که گذاشتم، حذف کنید یا بصورت کامنت در بیارین، کلاً دسترسی بصورت http یا ftp رو قدغن میکنه. اما اگه هاست اختصاصی دارین، میتونید خط ماقبل آخر رو از حالت کامنت در بیارین تا خودتون بتونید باهاش کار کنید. بعلاوه میتونید هر چندتا IP که میخواین رو اضافه کنید (اون خط رو کپی کنید و IP بعدی رو وارد کنید).

AbiriAmir
جمعه 13 بهمن 1391, 15:59 عصر
دوست عزیز
اگر بحث شما اینه که شخص ( هکر ) از طریق سرور دیگه فایل شما رو اینکلود کنه و از کلاس شما Instance بسازه که خوب این ممکن نیست...
میمونه 1 مساله دیگه و اونم این که شخصی داخل هاست شما فایل شما رو اینکلود کنه که خوب این هم اگر شخصی اینقدر دسترسی داشته باشه که وارد هاست شما بشه (فایل PHP به هاست شما وارد کنه) اونقدر اختیارات وسیعی رو داره که اصلا نیازی نداره بیاد فایل شما رو اینکلود کنه...
پس زیاد خودتون رو درگیر این مسائل نکنید...
نمیدونم شما چقدر وقته که PHP کار میکنید اما به هر حال کسانی که تازه وارد این مبحث میشن به امنیت به 1 دید خاص نگاه میکنن در صورتی که امنیت اصلا این نیست...
شما تنها کاری که میکنید اینه که 1 ثابتی رو define کنید و بعد هم چکش کنید ( همون روشی که استاد شهرکی فرمودن... )

yeksib
شنبه 14 بهمن 1391, 14:14 عصر
یکیش رو که دوستمون اشاره کردن (سطح دسترسی فایل رو روی 600 یا -------rw- بگذارین). یک روش دیگه، تعیین کد امنیتی هست. مثلاً توی فایلهایی که قراره اسکریپت شما رو include کنن و مجاز هستن و خودتون نوشتین، این کد رو قبل از include کردن بگذارین:

if(!defined('INCLUDE_KEY')) { define('INCLUDE_KEY', 'f19ff947d0f15fb59b22acbaef8e204a'); }
و توی فایل class.one.php (یا هر فایل دیگه که میخواین include اون، کنترل شده باشه، این کد رو قبل از هر کد دیگه بنویسید:


if(!defined('INCLUDE_KEY') || INCLUDE_KEY != 'f19ff947d0f15fb59b22acbaef8e204a') {
die('Unauthorized access.');
}


از روشی که شما گفتید استفاده کردم فعلا روی لوکال هستش ولی زیاد با این پیغام Unauthorized access مواجه میشم که پس از رفرش کردن صفحه رفع میشه !
1-اصلا چرا اینطور میشه؟(به نظر خودم شاید define دیر ست میشه).
2-آیا احتمالش هست توی هاست هم همچین چیزی اتفاق بیافته!؟