PDA

View Full Version : میزان اعتبار $_server



111qqq
دوشنبه 07 فروردین 1391, 20:29 عصر
کسی میدونه اجزای آرایه ی $_server چقدر اعتبار داره ......... یعنی کدوم هاشون امکان داره کاربر اونا رو تغییر بده ؟؟؟؟؟؟ ....... توی آشیانه یه پست هست که فقط گفته شده قابلیت تعدادی از تغییر وجود داره .... اونهایی که وابسته به سمت کاربر میشن ... که دیگه توضیحی داده نشده.....:متفکر:

کسی منابعی داره معرفی کنه؟؟؟؟؟؟؟؟

واسه اعتبار سنجی کاربر php.net یه کد داره ...... واقعا میشه به PHP_AUTH_USER اعتماد کرد ...!!!!!... چون اگه مستقیم وارد صفحه بشه PHP_AUTH_USER اصالا وجود نداره ........... که احساس میکنم سر این قضیه مشکل پیدا بشه ؟؟؟؟؟؟؟:متفکر:




<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Text to send if user hits Cancel button';
exit;
} else {
echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
}
?>




......................در کل راجع به $_server هر کی اطلاعات خاصی داره بگه ..........

eshpilen
دوشنبه 07 فروردین 1391, 21:10 عصر
خب تعداد متغییرهای $_SERVER کم نیست و هرکدام باید جداگانه بررسی بشن.
و اگر با پروتکل HTTP و برنامه نویسی سوکت هم کار کرده باشید خیلی بهتر متوجه میشید.
ولی بطور کلی میشه گفت اونایی که با پیشوند HTTP نامگذاری شدن از همه بی اعتبارتر هستن، چون توسط کلاینت ساخته و ارسال میشن.
مثلا HTTP_USER_AGENT که از سمت کلاینت میاد مثل آب خوردن قابل جعله و حتی نیاز به برنامه نویسی هم نیست (مرورگرها اغلب addon ها و امکاناتی دارن که این کار رو براحتی انجام میدن).
HTTP_HOST هم توسط کلاینت ساخته و ارسال میشه، اما اگر مطابق دامین سایت شما نباشه اون درخواست اصلا به سایت شما نمیرسه بطور معمول. چون شیرهاست ها با استفاده از همین هدر میفهمن که درخواست برای کدام سایت ارسال شده. ولی درمورد هاستهای اختصاصی مطالعه و تست نداشتم و بنابراین مطمئن نیستم از این بابت؛ بستگی به کانفیگ وب سرور داره بنظرم.
بقیهء متغییرها هم میتونن خطرناک باشن. هرکدام بررسی جداگانه میخوان و ممکنه داستان داشته باشن.
مثلا PHP_SELF خودش یه داستان و خطر داره بخاطر یک ویژگی که در نرم افزارهای وب سرور هست و برای برنامه نویسان میتونه ناشناخته و غیرمنتظره باشه.
بعضی چیزا رو کلاینت نمیتونه دستکاری کنه چون فقط در سمت و از اطلاعات خود سرور ایجاد میشن. مثلا SERVER_SOFTWARE.
REMOTE_ADDR هم که IP کلاینت هست بهرحال آیپی سوکتی هست که ارتباط باهاش برقرار شده، اما این IP میتونه مثلا مال یک پراکسی باشه که کاربر ازش استفاده کرده. جعل مستقیم IP توسط کلاینت تقریبا غیرممکنه، ولی میتونه از یک واسطه استفاده کنه.
اتفاقا اخیرا از REQUEST_TIME در برنامم استفاده کرده بودم، بعد دیدم مطمئن نیستم که این زمان از زمان سرور تولید بشه و شاید از روی هدر ارسال شده توسط کلاینت ست میشه. میخواستم راجع بهش تحقیق کنم ولی ساده تر و مطمئن تر دیدم که بجاش از تابع time خود پی اچ پی استفاده کنم.

111qqq
دوشنبه 07 فروردین 1391, 21:42 عصر
ممنون توضیحاتت مفید بود ..... اگه بیشتر توضیح میدادی که دیگه عاااااااااالییییییییییییی بود ........ مثلا یعنی چی HTTP_HOST ممکنه به سایت نرسه ؟؟؟؟ ... و چه جوری ؟؟؟؟ ......یا همین PHP_SELF خیلی حرف راجع بهش هست ولی هیچکی نگفته چرا خطرناکه ؟؟؟؟

البته اینجور مطالب توی منابع خارجی به وفور پیدا میشه (ولی خوب میدونی مزه لقمه آماده یه چیز دیگه ست:قهقهه: )(آدم تنبل پیشرفتش لاکپشتیه ..... البته تنبل نیستم .... واضحه که خوندن مطالب خارجی وقت بیشتری میگیره و خوب تا بتونم از لقمه های آماده ی فارسی استفاده میکنم).......... اگه منبع جامع تری واسه اجزای $_server داری بگو .......... خودت هم اگه بیشتر تونستی توضیح بدی که ممنون .........

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

eshpilen
دوشنبه 07 فروردین 1391, 22:25 عصر
ممنون توضیحاتت مفید بود ..... اگه بیشتر توضیح میدادی که دیگه عاااااااااالییییییییییییی بود ........ مثلا یعنی چی HTTP_HOST ممکنه به سایت نرسه ؟؟؟؟ ... و چه جوری ؟؟؟؟

مقدار HTTP_HOST برابر مقدار هدر host است که مرورگر ارسال میکنه.
فرضا سایت شما با دامین 111qqq.com روی یک شیرهاست است که صدتا سایت دیگر رو هم ارائه میکنه.
همهء این سایتها یک سرور و یک IP دارن.
وقتی کاربر در مرورگرش آدرس سایت شما رو وارد میکنه، مرورگر IP سرور سایت شما رو با استفاده از DNS پیدا کرده و بعد بوسیلهء سوکت به اون IP وصل میشه (سر دیگر ارتباط وب سرور است)، تا اینجا سرور مورد نظر نمیدونه که مرورگر شما برای کدامیک از سایتهایی که روی اون سرور هستن درخواست خواهد داشت. در جواب درخواست HTTP که مرورگر فورا پس از برقراری اتصال سوکت ارسال خواهد کرد باید سایت 111qqq.com رو نشون بده یا hamid234.com رو یا ...؟
بنابراین مرورگر وقتی درخواست HTTP رو روی ارتباط سوکتی برقرار شده ارسال میکنه، هدری رو ست میکنه بنام host که محتوی نام دامینی است که کاربر در مرورگر خودش وارد کرده. یعنی در مثال ما هدر ارسال شده اینه: host: 111qqq.com.
مقدار همین هدر هست که در آرایهء $_SERVER تحت عنوان HTTP_HOST ست میشه.
یعنی متغییر HTTP_HOST شما در آرایهء $_SERVER برابر 111qqq.com خواهد بود.
ممکنه فرضا سایت شما دوتا دامین داشته باشه. مثلا بجز 111qqq.com دامین 111qqq.ir هم مال شماست.
در این صورت کاربر با هر اسم دامینی که به سایت شما درخواست ارسال کرده باشه همون دامین در HTTP_HOST خواهد بود.
حالا اومدیم و کلاینت هدر host رو دستکاری کرد و یک درخواست به IP سرور شما اما با host: hackerx.com ارسال کرد. در این صورت چه میشود؟
خب سرور شما میبینه هیچ سایتی با دامین hackerx.com رو روی خودش نداره، و بنابراین درخواست مورد نظر هیچوقت به سایت شما تحویل داده نمیشه (چون هیچ راه دیگری برای مشخص شدن اینکه درخواست برای چه سایتی بوده وجود نداره) و بجاش یک پاسخ و صفحهء خطای مختصر توسط نرم افزار وب سرور به کلاینت مورد نظر ارسال میشه.

اما روی سرورهای اختصاصی ممکنه شرایط تفاوت بکنه و کانفیگ طور دیگری باشه. چون روی اونها فقط یک سایت وجود داره و نیازی به هدر host برای تشخیص سایت هدف نیست.


......یا همین PHP_SELF خیلی حرف راجع بهش هست ولی هیچکی نگفته چرا خطرناکه ؟؟؟؟این رو در فایلی بنام test.php ذخیره کن:

<?php

echo $_SERVER['PHP_SELF'];

?>

حالا http://localhost/test.php رو در مرورگر باز کن.
میبینی که آدرس صفحهء جاری رو نسبت به ریشهء www نشون میده.

حالا این آدرس رو در مرورگر وارد کن:

http://localhost/test.php/%3Cscript%3Ealert%28%27I%20am%20XSS%27%29;%3C/script%3E
خواهی دید که مطابق هدف نفوذگر، یک کد جاوااسکریپت در صفحهء شما اجرا میشه.
چون PHP_SELF مستقیما حاوی هرچیزی میشه که در آدرس درخواست وجود داشته، بنابراین اگر شما اون رو همینطور خام در سورس صفحه بکار ببرید خطر حملات XSS (تزریق اسکریپت) وجود داره.
این بخاطر یک ویژگی غیراستاندارد وب سرورهاست که امکان فراخوانی به این شکل رو میده (یک اسلش و بعدش اطلاعات دیگه). البته الان دیگه شاید برای خودش استاندارد شده باشه.
ظاهرا این ویژگی بخاطر بهینه سازی آدرس ها برای موتورهای جستجو ایجاد شده.

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

mtchabok
چهارشنبه 09 فروردین 1391, 20:09 عصر
سلام
دوستان از SCRIPT_FILENAME هم استفاده نکنید . در صورتیکه مد ریرایت آپاچی رو روی یه فایل تنظیم کرده باشید آدرس فایل اسکریپت رو اشتباه نمایش میده ( البته در آدرسهایی که از فاصله و اسلش پشت سرهم استفاده شده باشه ) .