# زبان های اسکریپتی > PHP > سوال: توی پرومیشن ها منظور از کاربر، گروه و ادمین چیه؟

## i-php-i

من در مورد تخصیص مجوزها سرچ کردم و می دونم که باید اعدادی مثل 777، 644، 610 و ... رو می شه به فایلها و فولدرها تخصیص داد.

سوالم اینه که منظور از کاربر، گروه و ادمین چیه؟ چه کسانی کاربر هستن، چه کسانی عضو گروه یه فایل یا دایرکتوری هستن، و چه کسانی مدیر هستن؟

آیا می شه اسکریپتهای پی اچ پی که می نویسیم رو عضو یکی از این سه نوع (کاربر، گروه و مدیر) دونست؟

----------


## eshpilen

در سیستمهای یونیکسی، کاربر/Owner یعنی کسی که فایل رو ایجاد کرده. البته میشه ایجادکنندهء یک فایل رو بعدا هم با دستور مربوطه عوض کرد.
گروه هم یعنی یک گروه با اسم خاصی ایجاد میکنید و کاربرانی که عضو اون گروه باشن (کاربران مورد نظر رو هم میتونید با دستورات مربوط دیگری عضو اون گروه بکنید) دسترسی هایی رو که به فایل های مورد نظر به اون گروه اعطا شده بدست میارن (هر کاربر میتونه عضو بیش از یک گروه باشه). یعنی اگر درست یادم باشه هر فایل یک گروه هم داره. یعنی اون فایل متعلق به اون گروه هست.
ادمین هم معمولا همون کاربر با نام کاربری root هست که دسترسی کامل به سیستم داره و میتونه هر پرمیشن و گروهی رو دور بزنه یا تغییر بده. کاربر root برای مدیریت سیستم بکار میره.
چیزی بنام مدیر هم نداریم بنظرم! مگر اینکه کاربران خاصی رو طوری مثل root تعیین بکنیم (ظاهرا با روشی ممکن هست). یا اینکه کاربران یا گروه خاصی رو که نسبت به مجموعه ای از فایلها و دایرکتوری های خاص اختیارات گسترده دارن مدیر بنامیم. درهرصورت باید پرمیشن و گروه اون فایلها رو قبلا تنظیم بکنید تا اون کاربران بتونن به اون فایلها دسترسی گسترده داشته باشن.
اما نکتهء مهم اینکه اسکریپت های PHP همگی تحت یک کاربر خاص اجرا میشن که احتمالا کاربر apache هست. چون PHP تحت آپاچی اجرا میشه و متاسفانه گزینه ای برای تغییر کاربری که اسکریپت تحت اون اجرا میشه وجود نداره (و یکسری حفره ها و دشواری های امنیتی هم بخاطر همین بوجود اومدن). بنابراین وقتی شما میخواید دسترسی خواندن و نوشتن و غیره به PHP بدید درواقع این دسترسی ها رو روی فایل یا فولدر مورد نظر باید به کاربری با نام apache یا گروهی که apache عضوش باشه بدید و طبیعتا برای انجام این راههای مختلفی هست. مثلا میشه apache رو بعنوان Owner اون فایل یا فولدر تعیین کرد، یا گروهی رو که apache عضوش هست بعنوان گروه فایل تعیین کرد (طبیعتا اون گروه باید دسترسی لازم رو به اون فایل داشته باشه). البته معمولا شما نیازی به اینهمه کار و پیچیدگی ندارید و همه چیز تنظیم هست و شما فقط پرمیشن ها رو تعیین میکنید. یه راه سریع و راحت ولی غیراصولی هم اینه که اختیارات کامل رو درمورد اون فایل یا فولدر به همگان بدید (پرمیشن 777)؛ اما مسلمه که این روش ضعف امنیتی داره و هرکسی ممکنه از راهی به فایل شما دسترسی پیدا کنه.

در یک سیستم یونیکسی، مثل سرورهای GNU/Linux، کاربران و گروههای متعددی وجود دارن که بخشی از اون کاربران و گروهها مخصوص برنامه ها و سیستمهای مختلف سیستم عامل و برنامه های مختلفی که روش نصب شدن هستن، مثلا آپاچی برای خودش یک کاربر بنام apache ایجاد میکنه و تحت اون اجرا میشه، و بخش دیگر هم کاربران انسانی. مثلا شما که روی یک هاست اشتراکی یک اکانت دارید یعنی یک نام کاربری روی سرور دارید که همونی هست که باهاش به سیستم لاگین میکنید.

یه مثال:
فرض کنید فایل x متعلق به کاربری با نام user1 هست و به گروه project2 تعلق داره. فرض کنید پرمیشن هایی که برای Owner تعیین شدن، خواندن و نوشتن و اجرا باشن، و پرمیشن هایی که برای گروه تعیین شدن شامل خواندن و اجرا باشن. در اینصورت user1 که میتونه عضو گروه project2 باشه یا نباشه، میتونه محتویات فایل رو بخونه، ویرایش کنه، دلیتش کنه، یا اجراش کنه (درصورتی که فایل قابل اجرا باشه)، و کاربرانی که عضو گروه project2 باشن میتونن محتویات فایل رو بخونن یا اجراش کنن (مسلما اجرا تحت نام کاربری خودشون صورت میگیره) اما نمیتونن اون رو ویرایش یا حذف کنن.
راستی یه پرمیشن هم داریم برای کاربرانی که نه Owner هستن و نه عضو گروه فایل. برای همین سه تا عدد/رقم داریم. مثلا 644 یا 777 و غیره. معمولا به کاربرانی دیگر غیر از Owner یا گروه حق دسترسی داده نمیشه یا حق دسترسی محدودی داده میشه (مثلا فقط خواندن یا فقط اجرا).

----------


## i-php-i

> در سیستمهای یونیکسی، کاربر/Owner یعنی کسی که فایل رو ایجاد کرده. البته میشه ایجادکنندهء یک فایل رو بعدا هم با دستور مربوطه عوض کرد.
> گروه هم یعنی یک گروه با اسم خاصی ایجاد میکنید و کاربرانی که عضو اون گروه باشن (کاربران مورد نظر رو هم میتونید با دستورات مربوط دیگری عضو اون گروه بکنید) دسترسی هایی رو که به فایل های مورد نظر به اون گروه اعطا شده بدست میارن. یعنی اگر درست یادم باشه هر فایل یک گروه هم داره. یعنی اون فایل متعلق به اون گروه هست.


من الان از سرویسهای اشتراکی استفاده می کنم، معمولا سایت رو روی لوکال می نویسم و بعذ آپلودش می کنم.

می خوام بدونم که:

1- من کاربر هستم، عضو گروه هستم یا ادمین؟

2- سایر کسانی که توی این سرور اشتراکی وب سایت دارن، عضو چه دسته ای هستن؟

3- افرادی که سرور رو پشتیبانی می کنن عضو کدوم دسته هستن؟

4- بازدیدکنندگان وب سایت عضو کدوم دسته هستن؟

----------


## eshpilen

> 1- من کاربر هستم، عضو گروه هستم یا ادمین؟


شما یه کاربر عادی هستید با نام کاربری خودتون.
و اونطور که الان روی هاست خودم چک کردم عضو هیچ گروهی نیستید.
ادمین هم که مسلما نیستید. فقط یه کاربر آس و پاس معمولی هستید  :لبخند گشاده!: 




> 2- سایر کسانی که توی این سرور اشتراکی وب سایت دارن، عضو چه دسته ای هستن؟


اونا هم مثل شما.




> 3- افرادی که سرور رو پشتیبانی می کنن عضو کدوم دسته هستن؟


خب بستگی داره از چه روشی استفاده کنن. مثلا با ssh وصل بشن یا از اینترفیس کنترل پنل تحت وب استفاده کنن. درهرصورت احتمالا بیشتر وقتا یک نفر یا چند نفر هستن که تحت یک نام کاربری مشترک فعالیت میکنن. تنها ادمین سرور میتونه به پسورد root دسترسی داشته باشه. بقیه میتونن فقط سایت خودشون یا سایتهایی رو که مدیریت میکنن با کاربر مورد نیاز مدیریت کنن. اگر این کار توسط کنترل پنل مثلا cPanel انجام بشه خب یک کاربر بخصوص داره که با اون کار میکنن، ولی جزییاتش رو نمیدونم. اونا با این کاربر و پسوردش به cPanel  لاگین میکنن، اما ممکنه cPanel  تحت عنوان کاربر دیگری روی سیستم کارهاش رو انجام میده، چون کاربری که نرم افزار ایجاد میکنه و بعنوان مدیر میشناسه میتونه مستقل از کاربری که خود نرم افزار تحت اون روی سیستم اجرا میشه باشه.





> 4- بازدیدکنندگان وب سایت عضو کدوم دسته هستن؟


 اونها همه تحت کاربر آپاچی (apache) یا هر کاربر دیگری که PHP تحت اون اجرا میشه هستن. بازدید کننده ها ارتباطی با کاربران و گروهها و پرمیشن بندی روی سیستم ندارن و نرم افزار سرویس دهنده بجای همهء اونها عمل میکنه.

----------


## i-php-i

> شما یه کاربر عادی هستید با نام کاربری خودتون.
> و اونطور که الان روی هاست خودم چک کردم عضو هیچ گروهی نیستید.
> ادمین هم که مسلما نیستید. فقط یه کاربر آس و پاس معمولی هستید 
> 
> اونا هم مثل شما.
> 
> خب بستگی داره از چه روشی استفاده کنن. مثلا با ssh وصل بشن یا از اینترفیس کنترل پنل تحت وب استفاده کنن. درهرصورت احتمالا بیشتر وقتا یک نفر یا چند نفر هستن که تحت یک نام کاربری مشترک فعالیت میکنن. تنها ادمین سرور میتونه به پسورد root دسترسی داشته باشه. بقیه میتونن فقط سایت خودشون یا سایتهایی رو که مدیریت میکنن با کاربر مورد نیاز مدیریت کنن. اگر این کار توسط کنترل پنل مثلا cPanel انجام بشه خب یک کاربر بخصوص داره که با اون کار میکنن، ولی جزییاتش رو نمیدونم. اونا با این کاربر و پسوردش به cPanel  لاگین میکنن، اما ممکنه cPanel  تحت عنوان کاربر دیگری روی سیستم کارهاش رو انجام میده، چون کاربری که نرم افزار ایجاد میکنه و بعنوان مدیر میشناسه میتونه مستقل از کاربری که خود نرم افزار تحت اون روی سیستم اجرا میشه باشه.
> 
> 
>  اونها همه تحت کاربر آپاچی (apache) یا هر کاربر دیگری که PHP تحت اون اجرا میشه هستن. بازدید کننده ها ارتباطی با کاربران و گروهها و پرمیشن بندی روی سیستم ندارن و نرم افزار سرویس دهنده بجای همهء اونها عمل میکنه.


مطلبی که می گید منطقی بنظر نمی رسه.

اگر یه کاربر عادی هستم، چطورمی تونم مجوزها رو برای کاربران، گروهها و مدیران تغییر بدم؟


لطفا بیشتر توضیح بدید.

----------


## eshpilen

> اگر یه کاربر عادی هستم، چطورمی تونم مجوزها رو برای کاربران، گروهها و مدیران تغییر بدم؟


این کارها رو میتونید روی فایلهای خودتون، یعنی اونهایی که شما Owner اونها هستید انجام بدید، چون مجوزهای لازم برای این کارها به Owner داده شده بصورت پیشفرض. اما مثلا کاربر عادی دیگر چون Owner فایل شما نیست نمیتونه این کارها رو روی فایل شما انجام بده.
اگر در هاست خودتون نگاه کنید، نام کاربری شما بعنوان Owner بسیاری از فایلهایی که در پوشهء خانگی شما قرار دارن تعیین شده. لزوما تمام این فایلها رو خودتون ایجاد نکردید، اما شما بعنوان Owner اونها تعیین شدید.

----------


## i-php-i

> این کارها رو میتونید روی فایلهای خودتون، یعنی اونهایی که شما Owner اونها هستید انجام بدید، چون مجوزهای لازم برای این کارها به Owner داده شده بصورت پیشفرض. اما مثلا کاربر عادی دیگر چون Owner فایل شما نیست نمیتونه این کارها رو روی فایل شما انجام بده.
> اگر در هاست خودتون نگاه کنید، نام کاربری شما بعنوان Owner بسیاری از فایلهایی که در پوشهء خانگی شما قرار دارن تعیین شده. لزوما تمام این فایلها رو خودتون ایجاد نکردید، اما شما بعنوان Owner اونها تعیین شدید.


 با این گفته شما من که یه کاربر عادی هستم می تونم دسترسی ادمین به یه فایل یا پوشه رو تغییر بدم. 
 این مطلب درسته؟

من فکر می کنم که توی پنل، راه منطقی اینه که من مدیر باشم. 

شاید مجوزهای لینوکس توی سرورهای اشتراکی اون معنای واقعی خودشون رو نداشته باشن.

شما چه نظری دارید؟

----------


## eshpilen

> با این گفته شما من که یه کاربر عادی هستم می تونم دسترسی ادمین به یه فایل یا پوشه رو تغییر بدم.


خیر ادمین، یا همون کاربر ریشه (root)، یک کاربر استثنایی هست که در هر صورت به تمام سیستم دسترسی نامحدود داره. نمیشه جلوش رو با پرمیشن گرفت. ولی درمورد بقیهء کاربران میتونید با پرمیشن ها هر محدودیتی بذارید (البته نسبت به فایلهای خودتون - یعنی فایلهایی که نام کاربری شما بعنوان Owner اونها تعیین شده). البته باید دقت کنید مثلا اگر اجازهء خوندن فایلی رو به هیچکس ندید و اون فایل مورد نیاز هست مثلا توسط آپاچی خونده بشه (مثلا یک فایل PHP) اونوقت احتمالا مشکل پیش میاد. بعضی فایلها هستن که نیاز هست پرمیشن های لازم درمورد اونها به بقیه هم داده بشه. مثل فایلهایی که در www هستن و باید بشه خوند تا وب سرور بتونه اونا رو سرویس دهی کنه.




> من فکر می کنم که توی پنل، راه منطقی اینه که من مدیر باشم.


یعنی چی؟ شما برای چی باید مدیر باشید؟ اصلا منظورتون از مدیر چیه؟




> شاید مجوزهای لینوکس توی سرورهای اشتراکی اون معنای واقعی خودشون رو نداشته باشن.


چرا معنا ندارن؟
اتفاقا همین الان داشتم یکسری تست روی هاست انجام میدادم. متوجه شدم که ظاهرا یکسری مشخصات فایل رو فقط Owner میتونه تغییر بده. مثلا پرمیشن ها رو فقط Owner میتونه تغییر بده، گرچه دسترسی فایل 777 باشه. ضمنا اونطور که تست های من میگن حتی Owner هم نمیتونه Owner فایلهای خودش رو تغییر بده. احتمالا این کار باید فقط توسط root انجام بشه.

----------


## eshpilen

الان تست کردم بطور مثال اگر آپاچی پرمیشن خواندن یک فایل رو نداشته باشه موقعی که آدرس اون فایل رو در مرورگر وارد کنید پیام خطای عدم دسترسی داده میشه:

You don't have permission to access /test/text4.txt on this server.

این نشون میده که پرمیشن ها کاملا اثر دارن.
ضمنا موضوع دیگه ای که فهمیدم اینه که اگر پرمیشن یک فایل رو برابر 000 قرار بدیم، حتی از دسترسی Owner بهش جلوگیری میشه ولی Owner میتونه بازم پرمیشن اون فایل رو تغییر بده.

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

اگر خواستید تست کنید میتونید از توابع خود PHP برای اینطور کارها، مثل تابع chmod، استفاده کنید.
یه نکتهء مهم هم اینکه موقعی که پرمیشن رو بصورت عددی به تابع chmod میدید قبلش یک صفر بذارید تا مشخص بشه عدد در مبنای 8 هست. بطور مثال به این شکل:
chmod('text5.txt', 0600);
من سر همین موضوع یخورده سر کار رفته بودم. یه پرمیشن تعیین میکردم و یه چیز دیگه از آب درمیومد!

----------


## eshpilen

خوبه که به جهت کامل شدن مطالب مطرح شده در این تاپیک مطلب دیگری رو مطرح کنم.
گفتیم که همهء برنامه های PHP تحت کاربر apache اجرا میشن و از طرف دیگه نیاز هست apache حداقل به فایلهای لازم داخل www دسترسی داشته باشه تا بتونه وبسایت ما رو اجرا کنه. سوال خوب و باریک بینانه ای که در اینجا پیش میاد اینه که در اینصورت آیا سایتها/کاربران دیگری که با ما روی یک هاست اشتراکی هستن قادر نخواهند بود تا به فایلهای ما دسترسی پیدا کنن؟
طی تست هایی که بنده داشتم انجام میدادم خواستم با استفاده از PHP به بعضی فایلهای خاص که در لینوکس اجازهء دسترسی به اونها داده شده دسترسی پیدا کنم که با یک پیام خطا نظیر این روبرو شدم:

open_basedir restriction in effect. File(/etc/shadow) is not within the  allowed path(s): (/home/myuser/:/tmp:/var/tmp:/usr/local/lib/php/) in */home/myuser/domains/mydomain.com/public_html/test/test.php* on line *2*

خب این پیام خطا تنظیم open_basedir برای کاربر جاری رو نشون میده که میگه این کاربر فقط به دایرکتوری های خاصی که لیست شدن میتونه دسترسی داشته باشه. یکی دایرکتوری خانگی خودش (/home/myuser/) که فایلهای وب خودش هم در یک زیردایرکتوری از اون قرار دارن، دیگری دایرکتوری tmp و غیره که کاربرد همه مشخص هست و برنامهء کاربر یا PHP یا آپاچی با این دایرکتوری ها به نحوی سروکار دارن یا ممکنه سروکار داشته باشن.

بنابراین خوشبختانه اگر این تنظیمات درست اعمال شده باشن، کاربران دیگر نمیتونن به فایلهای شما دسترسی پیدا کنن.
حالا اینکه چطور در هاستهای اشتراکی این تنظیمات رو به ازای هر کاربر تعیین میکنن بنده اطلاع ندارم و اگر شما فهمیدید به ما هم خبر بدید. چون بنظرم این یه تنظیم کلی هست در حالت عادی (یعنی برای تمام کاربران یک تنظیم یکسان)، درحالیکه به ازای هر کاربر، آدرس دایرکتوری خانگی تفاوت میکنه.

خلاصه این محدودیت مربوط به سیستم عامل و پرمیشن ها و سیستم فایل سرور نمیشه، چون همونطور که گفتیم بخاطر اینکه تمام برنامه های PHP تحت یک کاربر مشترک اجرا میشن امکان تفکیک دسترسی اونها وجود نداره و سیستم همه رو بعنوان یک کاربر واحد میبینه (بخاطر همینه که اگر فایلهای سشن در tmp ذخیره بشن همه میتونن به فایلهای سشن همدیگر دسترسی داشته باشن). اما این تنظیم PHP جلوی دسترسی کاربران به دایرکتوری و فایلهای موجود در دایرکتوری خانگی دیگران رو میگیره. چون من بطور مثال فقط به /home/myuser/ که دایرکتوری خانگی خودم هست دسترسی دارم و نه /home/user2/.

----------------------------

ویرایش:


> طی تست هایی که بنده داشتم انجام میدادم خواستم با استفاده از PHP به بعضی  فایلهای خاص که در لینوکس اجازهء دسترسی به اونها داده شده دسترسی پیدا کنم  که با یک پیام خطا نظیر این روبرو شدم:
> 
> open_basedir restriction in effect. File(/etc/shadow) is not within the   allowed path(s): (/home/myuser/:/tmp:/var/tmp:/usr/local/lib/php/) in */home/myuser/domains/mydomain.com/public_html/test/test.php* on line *2*


یک اشتباه کوچک در این مطلب وجود داره و اون اینکه آزمایش رو روی فایل /etc/shadow انجام دادم که درواقع پرمیشن دسترسی برای کاربران عادی رو نداره؛ باید مثال رو با فایل /etc/passwd میزدم. اما بهرحال مشکلی در اصل این مطلب نداره و بقیهء مطالب و نتیجه گیری کاملا صحیح هستن.

----------


## i-php-i

> خوبه که به جهت کامل شدن مطالب مطرح شده در این تاپیک مطلب دیگری رو مطرح کنم.
> گفتیم که همهء برنامه های PHP تحت کاربر apache اجرا میشن و از طرف دیگه نیاز هست apache حداقل به فایلهای لازم داخل www دسترسی داشته باشه تا بتونه وبسایت ما رو اجرا کنه. سوال خوب و باریک بینانه ای که در اینجا پیش میاد اینه که در اینصورت آیا سایتها/کاربران دیگری که با ما روی یک هاست اشتراکی هستن قادر نخواهند بود تا به فایلهای ما دسترسی پیدا کنن؟
> طی تست هایی که بنده داشتم انجام میدادم خواستم با استفاده از PHP به بعضی فایلهای خاص که در لینوکس اجازهء دسترسی به اونها داده شده دسترسی پیدا کنم که با یک پیام خطا نظیر این روبرو شدم:
> 
> open_basedir restriction in effect. File(/etc/shadow) is not within the  allowed path(s): (/home/myuser/:/tmp:/var/tmp:/usr/local/lib/php/) in */home/myuser/domains/mydomain.com/public_html/test/test.php* on line *2*
> 
> خب این پیام خطا تنظیم open_basedir برای کاربر جاری رو نشون میده که میگه این کاربر فقط به دایرکتوری های خاصی که لیست شدن میتونه دسترسی داشته باشه. یکی دایرکتوری خانگی خودش (/home/myuser/) که فایلهای وب خودش هم در یک زیردایرکتوری از اون قرار دارن، دیگری دایرکتوری tmp و غیره که کاربرد همه مشخص هست و برنامهء کاربر یا PHP یا آپاچی با این دایرکتوری ها به نحوی سروکار دارن یا ممکنه سروکار داشته باشن.
> 
> بنابراین خوشبختانه اگر این تنظیمات درست اعمال شده باشن، کاربران دیگر نمیتونن به فایلهای شما دسترسی پیدا کنن.
> ...


 من جایی خونده بودم که پرومیشن ها توی سرورهای اشتراکی به معنای واقعی خودشون نیستن.

حالا نمی دونم این معنا درسته یا نه.

سایر دوستان چه نظری دارن؟

----------


## eshpilen

> من جایی خونده بودم که پرومیشن ها توی سرورهای اشتراکی به معنای واقعی خودشون نیستن.


اگر از منبع معتبری بوده بازهم نیاز هست منبعش رو بذارید تا بررسی کنیم ببینیم دقیقا چی گفته و منظورش چی بوده.

و شاید هم بخاطر همین که PHP کلا تحت apache اجرا میشه این حرف رو زدن. چون در اینصورت پرمیشن ها قابل استفادهء کامل نیستن. وقتی شما مجبور باشید به apache اجازهء خواندن و گاهی نوشتن هم بدید و بقیهء کاربران هم تحت apache باشن دیگه نمیشه از سیستم پرمیشن برای محدود کردن دسترسی استفاده کرد چون نمیشه بین کاربران و سایتهای مختلف در سیستم فایل و کنترل دسترسی تفاوت قائل شد. سیستم همه رو بصورت یک کاربر بنام apache میبینه.
اما اینطوری هم نیست که بگیم پرمیشن بدردی نمیخوره. چون خیلی کاربردها و کارایی امنیتی از جهات دیگه داره و داستان فقط PHP یا آپاچی و بحث وب سرور نیست.
بطور مثال دقیقا شما وقتی با استفاده از ssh به هاست خودتون وصل بشید سیستم پرمیشن کاملا موثر هست و مشاهده میشه.

----------


## i-php-i

> اگر از منبع معتبری بوده بازهم نیاز هست منبعش رو بذارید تا بررسی کنیم ببینیم دقیقا چی گفته و منظورش چی بوده.
> 
> و شاید هم بخاطر همین که PHP کلا تحت apache اجرا میشه این حرف رو زدن. چون در اینصورت پرمیشن ها قابل استفادهء کامل نیستن. وقتی شما مجبور باشید به apache اجازهء خواندن و گاهی نوشتن هم بدید و بقیهء کاربران هم تحت apache باشن دیگه نمیشه از سیستم پرمیشن برای محدود کردن دسترسی استفاده کرد چون نمیشه بین کاربران و سایتهای مختلف در سیستم فایل و کنترل دسترسی تفاوت قائل شد. سیستم همه رو بصورت یک کاربر بنام apache میبینه.
> اما اینطوری هم نیست که بگیم پرمیشن بدردی نمیخوره. چون خیلی کاربردها و کارایی امنیتی از جهات دیگه داره و داستان فقط PHP یا آپاچی و بحث وب سرور نیست.
> بطور مثال دقیقا شما وقتی با استفاده از ssh به هاست خودتون وصل بشید سیستم پرمیشن کاملا موثر هست و مشاهده میشه.


 کد 0644 به چه معنی هست و جلوی دسترسی چه افرادی رو می گیره؟

----------


## eshpilen

عدد اول از سمت چپ پرمیشن Owner (مالک) هست.
عدد دوم پرمیشن برای افراد عضو گروه (Group) فایل یا دایرکتوری موردنظر هست.
عدد سوم پرمیشن برای دیگران هست.
پرمیشن خواندن 4 هست. پرمیشن نوشتن 2 هست. پرمیشن اجرا 1 هست.
بنابراین عدد 6 که از جمع دو عدد 4 و 2 حاصل شده یعنی پرمیشن برای خواندن و نوشتن.
پس مشخصه که اون دوتا عدد 4 هم یعنی فقط اجازهء خواندن برای گروه و افراد دیگر.
اگر فایل اجرایی نباشه به پرمیشن اجرا نیازی نیست، اما درمورد دایرکتوری ها برای ورود به یک دایرکتوری نیاز به پرمیشن اجرا هست بنظرم (روی هاست خودتون نگاهی به پرمیشن ها بکنید).
به زودی انشاا... یکسری تست دیگه هم انجام میدم و اطلاعات تکمیلی میذارم.

----------


## i-php-i

> عدد اول از سمت چپ پرمیشن Owner (مالک) هست.
> عدد دوم پرمیشن برای افراد عضو گروه (Group) فایل یا دایرکتوری موردنظر هست.
> عدد سوم پرمیشن برای دیگران هست.
> پرمیشن خواندن 4 هست. پرمیشن نوشتن 2 هست. پرمیشن اجرا 1 هست.
> بنابراین عدد 6 که از جمع دو عدد 4 و 2 حاصل شده یعنی پرمیشن برای خواندن و نوشتن.
> پس مشخصه که اون دوتا عدد 4 هم یعنی فقط اجازهء خواندن برای گروه و افراد دیگر.
> اگر فایل اجرایی نباشه به پرمیشن اجرا نیازی نیست، اما درمورد دایرکتوری ها برای ورود به یک دایرکتوری نیاز به پرمیشن اجرا هست بنظرم (روی هاست خودتون نگاهی به پرمیشن ها بکنید).
> به زودی انشاا... یکسری تست دیگه هم انجام میدم و اطلاعات تکمیلی میذارم.


 فایلهای پی اچ پی به مجوز اجرا احتیاج ندارن؟

اگه می شه یه آموزش کامل در مورد مجوزها توی فروم قرار بدید. (به من هم خبر بدید  :چشمک: )

----------


## eshpilen

> فایلهای پی اچ پی به مجوز اجرا احتیاج ندارن؟


نه چون مستقیما اجرا نمیشن (اصولا در سیستم عامل هم این فایلها فایل اجرایی محسوب نمیشن). این فایلها توسط آپاچی خونده میشن و محتویات اونا به مفسر PHP تحویل داده میشه. بنابراین تنها مجوزی که لازم هست مجوز خواندن توسط آپاچی هست.
فایلهای PHP در این زمینه یک فایل عادی هستن و از نظر سیستم عامل اجرایی محسوب نمیشن و اجرا نمیشن، فقط خونده میشن.




> اگه می شه یه آموزش کامل در مورد مجوزها توی فروم قرار بدید. (به من هم خبر بدید )


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

ضمنا یه موضوع دیگه که الان تست کردم، کاربرد مجوز اجرا برای دایرکتوری ها هست.
فرض کنید ما یه دایرکتوری داریم بنام test2 که توش یک فایل داریم بنام t.txt.
فرض کنید فایل t.txt مجوز کامل خواندن، نوشتن و اجرا رو برای همه داره. پس محدودیتی در دسترسی به اون نیست. اما چون این فایل در دایرکتوری test2 قرار داره و قبل از دسترسی به t.txt باید وارد دایرکتوری test2 بشیم، اگر مجوز اجرا رو برای دایرکتوری test2 نداشته باشیم نمیتونیم به فایل داخلش دسترسی پیدا کنیم. توجه داشته باشید که مجوز خواندن درمورد یک دایرکتوری فقط اجازه میده بتونیم محتویات اون دایرکتوری رو لیست کنیم، چون از این جهت میشه دایرکتوری رو به صورت یک فایل که محتوی لیست اسم فایلها و دایرکتوری های دیگری هست فرض کرد. ما میتونیم با مجوز خواندن لیست این نامها رو بخونیم، اما بدون مجوز اجرا نمیتونیم به خود اون فایلها دسترسی پیدا کنیم.
سوال دیگری که پیش میاد اینه که اگر برعکس درمورد یک دایرکتوری مجوز اجرا رو داشته باشیم اما مجوز خواندن رو نداشته باشیم چی میشه.
جواب اینه که با دادن آدرس مستقیم یک فایل که داخل اون دایرکتوری هست میتونیم به اون فایل دسترسی داشته باشیم اما نمیتونیم لیست محتویات خود دایرکتوری رو بخونیم.

----------


## i-php-i

> نه چون مستقیما اجرا نمیشن (اصولا در سیستم عامل هم این فایلها فایل اجرایی محسوب نمیشن). این فایلها توسط آپاچی خونده میشن و محتویات اونا به مفسر PHP تحویل داده میشه. بنابراین تنها مجوزی که لازم هست مجوز خواندن توسط آپاچی هست.
> فایلهای PHP در این زمینه یک فایل عادی هستن و از نظر سیستم عامل اجرایی محسوب نمیشن و اجرا نمیشن، فقط خونده میشن.
> 
> 
> موارد کلی کافی رو همینجا گفتم و در لابلای بحث بقدر کافی جزییات مطرح شده. آموزش بیشتر هم بنظرم در نت متعدد وجود داره (همچنین به فارسی). پس دلیل خاصی نیست که آموزش بذارم. ولی اگر سوال یا مشکل خاصی داشتید مطرح کنید.
> 
> ضمنا یه موضوع دیگه که الان تست کردم، کاربرد مجوز اجرا برای دایرکتوری ها هست.
> فرض کنید ما یه دایرکتوری داریم بنام test2 که توش یک فایل داریم بنام t.txt.
> فرض کنید فایل t.txt مجوز کامل خواندن، نوشتن و اجرا رو برای همه داره. پس محدودیتی در دسترسی به اون نیست. اما چون این فایل در دایرکتوری test2 قرار داره و قبل از دسترسی به t.txt باید وارد دایرکتوری test2 بشیم، اگر مجوز اجرا رو برای دایرکتوری test2 نداشته باشیم نمیتونیم به فایل داخلش دسترسی پیدا کنیم. توجه داشته باشید که مجوز خواندن درمورد یک دایرکتوری فقط اجازه میده بتونیم محتویات اون دایرکتوری رو لیست کنیم، چون از این جهت میشه دایرکتوری رو به صورت یک فایل که محتوی لیست اسم فایلها و دایرکتوری های دیگری هست فرض کرد. ما میتونیم با مجوز خواندن لیست این نامها رو بخونیم، اما بدون مجوز اجرا نمیتونیم به خود اون فایلها دسترسی پیدا کنیم.
> ...


 فرض کنید که برای همه فایلها و پوشه های سایت مجوز 777 رو تعیین کردیم.


در این صورت بازدیدکننده گان سایت می تونن فایلها یا دایرکتوریها رو حذف کنن؟

----------


## eshpilen

> در این صورت بازدیدکننده گان سایت می تونن فایلها یا دایرکتوریها رو حذف کنن؟


سوالتون بنظر ساده میاد اما تحلیل و پاسخش پیچیده تر و دشوارتر و مفصل تر از ظاهرشه. بنده تاحدی که به ذهنم میرسه و دانش و تجربه دارم جواب میدم.

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

اما تعیین مجوز 777 میتونه از جهات دیگری خطرناک باشه. فرضا اگر کسی سایت شما رو هک کنه و بتونه فرامین دلخواهش رو با PHP اجرا کنه، مجوز 777 بهش کمک میکنه که به چیزهای خیلی بیشتری دسترسی نامحدود داشته باشه و درمورد تمام فایلها و دایرکتوریها بتونه محتویات اونا رو بخونه، حذفشون کنه، یا محتویاتشون رو دستکاری بکنه و شاید اینطور بتونه هک شدن سایت رو خیلی راحتتر پنهان بکنه و تا مدتها از سایت و کاربران شما سوء استفاده بکنه، چون بطور مثال میتونه محتویات فایلهای PHP شما رو هم دستکاری بکنه و مثلا کدهای جاسوسی در اونها کار بذاره.

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

بنابراین کلا این کار رو نکنید! هرجا فقط مجوزهایی رو که واقعا لازمه تنها درمورد فایلها و دایرکتوری هایی که لازم هست اعمال کنید.

فقط هم بحث بازدیدکنندگان نیست. امکان داره صاحبان سایتهای دیگه روی سرور اشتراکی شما که اونها هم اکانت و دسترسی به نرم افزارها و سرویسهای سرور دارن بتونن کارهای خیلی بیشتری بکنن. دسترسی به فایلهای شما هم لزوما فقط از طریق PHP ممکن نیست که بگیم مثلا تنظیم open_basedir جلوی دسترسی اونا رو میگیره، بلکه از روشها و نرم افزارهای دیگری هم میتونه باشه و ممکنه تنظیمات امنیتی لازم درمورد اون سرویسها درست انجام نشده باشن (بنظرم احتمالش کم نیست - مثلا بنده قبلا یک هاستی داشتم که دستم توش خیلی باز بود و توش یک وبشل هم نصب کرده بودم و فقط پرمیشن ها بودن که جلوی دسترسیم به کل سرور رو میگرفتن). مثلا طرف میتونه یک برنامهء اجرایی واقعی رو روی سرور اجرا بکنه و شاید بتونه از طریق اون برنامه خیلی محدودیت ها رو دور بزنه. اینجا اگر پرمیشن های شما 777 باشن مسلما ریسک خیلی بالاتری برای جاسوسی و دستکاری و پنهان کاری وجود داره.

----------


## eshpilen

خط فرمان لینوکس بسیار قدرتمنده و باهاش میشه خیلی کارها کرد.
مثلا شما کافیه پرمیشن یکی از فایلهای خودتون رو بذارید 777، و یکی که به خط فرمان لینوکس احاطه داشته باشه میتونه با یک فرمان فایل شما رو از میان هزاران فایل موجود در سرور در زمان کوتاهی پیدا کنه و حتی عملیاتی رو بصورت خودکار روی اونها انجام بده.
با برنامهء خط فرمان find در لینوکس میشه فایلها رو با خصوصیاتی که تعیین میکنیم از سراسر سیستم پیدا کرد. مثلا جستجو میکنیم فایلهایی که مجوز خواندن برای دیگران دارن رو پیدا بکنه. بنده چند بار از اینطور فرمانها روی سروری که بهش اشاره کردم محض کنجکاوی و یادگیری اجرا کردم و جالب اینکه همون چند بار کافی بود تا بطور تصادفی پسورد کنترل پنل شرکت هاستینگی رو که ازش هاست گرفته بودم کشف کنم!! در نتیجه اون هاستینگ هک شد و تا یکی دو ماه یا بیشتر بیش از هزار سایت مختلف تحت اختیارم بود، ولی خب نه اهلش بودم و نه وقتش رو داشتم که کاری باهاشون بکنم.
فکر میکنم خیلی هاست ها باشن که تنظیمات و محدودیت ها درشون واقعا خطرناک هستن. در اینطور مواقع پرمیشن ها میتونن جلوی خیلی از فجایع رو بگیرن. مثلا بنده سعی کردم ببینم میتونم فایلهای برنامهء شرکت هاستینگ رو دستکاری کنم و مثلا پیام هک و این حرفا بذارم و شاید یه کمی پز بدم (!) که دیدم پرمیشن هاش مثل سد مستحکمی غیرقابل عبور هست. اگر میتونستم فایلهاشون رو دستکاری کنم مثلا شاید میتونستم در اونها کد جاسوسی کار بذارم و باهاش کارهایی بکنم!
حالا نمیدونم اون پرمیشن ها رو چطور و چرا اونطور تنظیم کرده بودن که با بقیهء سایتها متفاوت بود. شاید چون اکانت اصلی بوده بصورت خودکار اونطور پیکربندی شده بوده.
حتی تونستم بخشی از محتویات دیتابیسشون رو بیرون بکشم، اما دستکاری فایلهای هاستینگ هرگز ممکن نشد!
پرمیشن های کامل و دقیق لینوکس واقعا کارا هستن و میشه گفت یکی از دلایل امنیت بیشتر لینوکس نسبت به ویندوز تاحالا همین بوده.

----------


## i-php-i

> سوالتون بنظر ساده میاد اما تحلیل و پاسخش پیچیده تر و دشوارتر و مفصل تر از ظاهرشه. بنده تاحدی که به ذهنم میرسه و دانش و تجربه دارم جواب میدم.


 برای اینکه مجوزها رو با استفاده از پی اچ پی تغییر بدیم، باید بهدر ابتدای هر مجوز از 0 (فرمت هگزا دسیمال) استفاده گنیم؟

----------


## eshpilen

بله یه صفر اول اون سه رقم بذار چون باید در مبنای 8 باشه.
هگزادسیمال نیست! هگز مبنای 16 رو میگن که با 0x یا x شروع میشه.
راستی عدد رو داخل کوتیشن نذاری.

----------


## i-php-i

> بله یه صفر اول اون سه رقم بذار چون باید در مبنای 8 باشه.
> هگزادسیمال نیست! هگز مبنای 16 رو میگن که با 0x یا x شروع میشه.
> راستی عدد رو داخل کوتیشن نذاری.


 اعداد و حروف در مبنای مختلف با چه علامتی شروع می شن؟

بنظرم دونستن اینها لازمه.

----------


## eshpilen

همون مبنای 8 و 16 پرکاربرد و استاندارد هستن. اینا فقط قرارداده برای شناسایی مبنا توسط کامپایلر و مفسرها.
زبانهای مختلف کم و بیش با هم تفاوت هایی در جزییات دارن. باید به مستندات هر زبان مراجعه کنی.

----------

