PDA

View Full Version : جعل شدن HTTP_REFERER



ayub_coder
دوشنبه 26 دی 1390, 16:08 عصر
با سلام خدمت دوستان
آیا امکان جعل شدن HTTP_REFERER وجود دارد؟
من در سرور آپاچی HTTP_REFERER را چک می کنم. اگه امکان جعل وجود دارد راه جلوگیری از این کار چیست؟

djsaeedkhan
دوشنبه 26 دی 1390, 17:20 عصر
با سلام
قبلا در فروم دربارش صحبت شده بود

function _Clean_HTTP_Header()
{
$_SERVER['QUERY_STRING']= htmlentities((string)$_SERVER['QUERY_STRING']);
$_SERVER['REQUEST_URI']= htmlentities((string)$_SERVER['REQUEST_URI']);
$_SERVER['HTTP_USER_AGENT']= htmlentities((string)$_SERVER['HTTP_USER_AGENT']);
$_SERVER['HTTP_REFERER']= htmlentities((string)$_SERVER['HTTP_REFERER']);
return((bool)true);
}



function _Check_HTTP_Header($Int_QueryLength= 100, $Int_URILength= 100)
{
# ~!@
return(strlen((string)$_SERVER['QUERY_STRING']) >= (int)$Int_QueryLength || strlen((string)$_SERVER['REQUEST_URI']) >= (int)$Int_URILength || strlen((string)$_SERVER['HTTP_USER_AGENT']) >= 255 || strstr((string)$_SERVER['QUERY_STRING'], '//') || strstr((string)$_SERVER['REQUEST_URI'], '//') || strstr((string)$_SERVER['HTTP_USER_AGENT'], '//') || strstr((string)$_SERVER['HTTP_REFERER'], '///') || strstr((string)$_SERVER['QUERY_STRING'], '\\') || strstr((string)$_SERVER['REQUEST_URI'], '\\') || strstr((string)$_SERVER['HTTP_USER_AGENT'], '\\') || strstr((string)$_SERVER['HTTP_REFERER'], '\\') || strstr((string)$_SERVER['QUERY_STRING'], '..') || strstr((string)$_SERVER['REQUEST_URI'], '..') || strstr((string)$_SERVER['HTTP_USER_AGENT'], '..') || strstr((string)$_SERVER['HTTP_REFERER'], '..') || strstr((string)$_SERVER['QUERY_STRING'], '::') ||strstr((string)$_SERVER['REQUEST_URI'], '::') || strstr((string)$_SERVER['HTTP_USER_AGENT'], '::') || strstr((string)$_SERVER['HTTP_REFERER'], '::') || strstr((string)$_SERVER['QUERY_STRING'], '~') ||strstr((string)$_SERVER['REQUEST_URI'], '~') || strstr((string)$_SERVER['HTTP_USER_AGENT'], '~') || strstr((string)$_SERVER['HTTP_REFERER'], '~') || (strtoupper($_SERVER['REQUEST_METHOD']) != 'GET' && strtoupper($_SERVER['REQUEST_METHOD']) != 'POST')) ? @exit('') : (bool)true;
}

eshpilen
دوشنبه 26 دی 1390, 17:39 عصر
آیا امکان جعل شدن HTTP_REFERER وجود دارد؟
کاملا. براحتی.

من در سرور آپاچی HTTP_REFERER را چک می کنم. اگه امکان جعل وجود دارد راه جلوگیری از این کار چیست؟
واسه چی چک میکنی؟

mtchabok
دوشنبه 26 دی 1390, 19:34 عصر
refferer توسط مرورگر ساخته میشه بنابراین هر کسی میتونه این هدر رو ارسال کنه .

من در سرور آپاچی HTTP_REFERER را چک می کنم. اگه امکان جعل وجود دارد راه جلوگیری از این کار چیست؟
اگه براتون واقعا مهمه میتونید آخرین درخواست رو در سشن یا جای دیگه ذخیره کنین و با refferer مقایسه کنین .

ayub_coder
سه شنبه 27 دی 1390, 09:47 صبح
با htaccess ورودی HTTP_REFERER رو چک می کنم اگه از سایت خاصی مثل SAMPLE.COM بود اجازه دسترسی به فایلی رو بده.در غیر این صورت خیر و اگه HTTP_REFERER جعل بشه این کار فایده ی نداره
چطوری می تونم این روش رو بکار ببرم.؟ آخه فایل توی یه سرور دیگه هست که mysql نداره (سرور دانلود - سرور 2)و نمی تونم توش با دیتابیس کار کنم. و کدهای php توی سرور دیگه (سرور 1)هست. می خوام از سرور 1 که php اجرا میشه یه لینک دانلود نمایش داده بشه و اگه کاربر از طریق کلیک روی اون لینک به سرور 2(سرور دانلود) منتقل شد اجازه دانلود داده بشه. یعنی کاربر با داشتن لینک فایل به صورت کپی و پیست کردن لینک نتونه فایل رو دانلود کنه و حتما از سایت قبلی و با کلیک روی لینک اجازه دانلود داشته باشه. امیدوارم مفهوم رو رسونده باشم :افسرده:

eshpilen
سه شنبه 27 دی 1390, 15:23 عصر
اینطور چیزا یه سیستم مفصل تر و پیچیده تری میخواد.
منم وقت و حضور ذهن ندارم خوب تحلیل کنم و یه چیزی مطمئن بگم. اما ایده های متعددی میتونه به ذهن برسه. بهرحال برای طراحی و پیاده سازی بی نقصش آدم باید حرفه ای باشه یحتمل!!
مثلا یک کلید رمز مخصوص رو بریزیم توی کوکی کاربر. اونور فایل نباید بصورت مستقیم قابل دانلود باشه، باید از طریق PHP ارائه بشه که صحت اون کلید رو چک کنه. البته این کلید برای فایلها و درخواستهای مختلف ثابت نیست، وگرنه با یک بار گرفتنش هرکس میتونه تمام فایلها رو دانلود کنه.
خب طبیعتا باید زمان دانلود و اعتبار اون کلید که حالا توی URL یا کوکی هست محدود باشه، وگرنه لینک رو میذارن توی اینترنت یا کوکی رو میشه جعل کرد.
ضمنا باید برنامه روی اون سرور چک کنه که چند نفر همزمان دانلود نکنن. البته اگر براتون مهمه. بستگی به اینم داره که فایل چقدر حجمش باشه و لینک یا کوکی برای دانلودش تا چه زمانی اعتبار داشته باشه. شاید بخواید تعداد دانلود رو هم محدود کنید. اما باید توجه داشت که در این صورت طرف خودش هم یک بار که دانلود کرد دوباره نمیتونه با همون لینک/کوکی دانلود کنه. و بعنوان محدودیت ها و اطمینان بیشتر شاید بخواید دانلود فقط با IP طرف که مشخص شده انجام بشه؛ ولی اینطوری اگر آیپی طرف به هر دلیلی عوض بشه به مشکل میخوره یحتمل ولی شاید بشه اینو یجوری حل کرد.
یه راه دیگه هم کپی کردن فایل با یک اسم رندوم (مثلا 32 کاراکتر رندوم) در جایی در www هست (بطور عادی فایلهامون خارج از www یا بهرصورتی غیرقابل دسترسی مستقیم هستن) که لینک به اون فایل ارجاع بشه بجای اینکه دانلود از طریق PHP انجام بشه. اینطوری برنامه ساده تر و سبک تر و امکانات یوزرفرندلی بیشتر میشه (مثلا قابلیت Resume میده بدون اینکه نیازی باشه شما این قابلیت رو پیاده سازی کنید) ولی از طرف دیگه میزان کنترلمون روی فرایند پایین میاد (مثلا جلوی دانلود همزمان رو چطور بگیریم؟).
اگر از این روش استفاده کنید بدیهی هست که بعد از یک زمان مشخصی باید اون فایل رو از www حذف یا rename کنید (به یک اسمی که تعداد زیادی کاراکتر رندوم داشته باشه تا کسی نتونه حدس بزنه - باید درمورد پارامترهای لازم برای جلوگیری از Brute-force اطلاعات کافی داشته باشید و رعایت کنید).

اینکه چطور دو سرور با هم اطلاعات رد و بدل کنن هم که خب راههای واضحی براش هست مثل ارسال درخواست HTTP با سوکت از سرور اول به سرور دوم.
البته لزوما نیازی نیست دو سرور بصورت مستقیم با هم ارتباط برقرار کنن. فکر میکنم میشه همهء اطلاعات لازم رو از طریق همون کوکی یا URL و اینها انتقال داد ( به طریقی که امن و غیرقابل دستکاری و جعل هم باشه).

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

eshpilen
سه شنبه 27 دی 1390, 15:38 عصر
راستی اون چک HTTP_REFERER رو هم میتونید بعنوان مکمل به سیستم اضافه کنید. اینطوری بازم امنیتش مقداری بالاتر میره و میتونه جلوی خیلی افراد عادی رو بگیره. البته باید اینم درنظر گرفت اگر کسی لینک رو جای دیگه کپی پیست کنه یا با یک نرم افزار دانلودر اقدام کنه، ممکنه HTTP_REFERER ارسال نشه (درمورد کلیک راست روی لینک و انتخاب دانلودر باید تست کنید ببینید REFERER رو ارسال میکنه یا نه). این یه محدودیتی هست که بسته به نظر و شرایط شما میتونه قابل قبول باشه یا نباشه.
خلاصه هزار و یک نکته و پارامتر داره هرچیزی.