تابع PHP برای به دست آوردن IP بازدید کننده در پشت CloudFlare یا Proxy

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

Cloudflare به عنوان یک CDN و فایروال DDoS بسیار عالیه اما نکته منفیش اینه که آدرس IP که توسط وب سرور شما مشاهده میشه همان پروکسی Clouflare است و نه IP واقعی مشتری.

ما بعد از گذشت چند ساعت و با زیاد شدن تعداد تیکت ها و نارضایتی کاربران از عدم امکان دانلود فایل متوجه شدیم. با بررسی متوجه شدم که تابعی که قبلا برای گرفتن IP کاربر نوشته بودم به جای یک IP دو تا بر می گردوند. از طرفی همان تابع روی سرور دانلود که روی سابدامین مستقلیه و پشت کلودفلر نیست یک IP بر میگردوند و شرط اجازه دانلود false میشد.

تابع قبلی

function get_user_ip ()
{
	if ( isset( $_SERVER['HTTP_CLIENT_IP'] ) )
		$ipaddress = $_SERVER['HTTP_CLIENT_IP'];
	else if ( isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) )
		$ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
	else if ( isset( $_SERVER['HTTP_X_FORWARDED'] ) )
		$ipaddress = $_SERVER['HTTP_X_FORWARDED'];
	else if ( isset( $_SERVER['HTTP_FORWARDED_FOR'] ) )
		$ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
	else if ( isset( $_SERVER['HTTP_FORWARDED'] ) )
		$ipaddress = $_SERVER['HTTP_FORWARDED'];
	else if ( isset( $_SERVER['REMOTE_ADDR'] ) )
		$ipaddress = $_SERVER['REMOTE_ADDR'];
	else
		$ipaddress = 'UNKNOWN';

	return $ipaddress;
}

مقدار بازگشتی . IP دوم مربوط به پروکسی Cloudflare هست و باعث مشکل شده بود.

84.242.51.236, 162.158.90.56

در نهایت برای رفع مشکل ، تابع زیر را جایگزین تابع قبلی کردم.

function get_user_ip ()
{
	if ( isset( $_SERVER["HTTP_CF_CONNECTING_IP"] ) )
	{
		$_SERVER['REMOTE_ADDR']    = $_SERVER["HTTP_CF_CONNECTING_IP"];
		$_SERVER['HTTP_CLIENT_IP'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
	}
	
	$client  = @$_SERVER['HTTP_CLIENT_IP'];
	$forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
	$remote  = $_SERVER['REMOTE_ADDR'];

	if ( filter_var( $client, FILTER_VALIDATE_IP ) )
		$ipaddress = $client;
	elseif ( filter_var( $forward, FILTER_VALIDATE_IP ) )
		$ipaddress = $forward;
	else
		$ipaddress = $remote;

	return $ipaddress;
}

چطور تحریم نقشه گوگل را دور بزنیم

همانطور که در جریان هستید سال گذشته گوگل سرویس نقشه اش را برای ایران و مخصوصا دامنه های IR تحریم کرد.

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

همچنین با مسدود کردن لینک ها، محدودیت تعداد بازدید نیز برداشته می شود.

<script type="text/javascript">
	Object.defineProperty(HTMLScriptElement.prototype, "__src__", Object.getOwnPropertyDescriptor(HTMLScriptElement.prototype, "src"));
	Object.defineProperty(HTMLScriptElement.prototype, "src", {
		configurable: true,
		enumerable: true,
		get() {
			return this.__src__;
		},
		set(new_src) {
			if (!new_src || !(new_src.startsWith("https://maps.googleapis.com/maps/api/js/AuthenticationService.Authenticate") ||
							  new_src.startsWith("https://maps.googleapis.com/maps/api/js/QuotaService.RecordEvent")))
				this.__src__ = new_src;
		}
	});
</script>
<script src="https://maps.google.com/maps/api/js?key=&language=fa"></script>

اولین نوشته من

چالش

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

سخت ترین بخشش هم انتخاب دامنه بود. دلم می خواست با اسم کوچیکم می تونستم دامنه ثبت کنم که متاسفانه خالی نبود. فامیلی هم همینطور! چند بار دامنه های مختلف ثبت کردم ولی به دلم ننشست. دیگه خلاصه مجبور شدم اسم کامل را بزارم و شروع کنم.

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

هدفم چیه

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

اینجا قرار نیست سایتی باشه پر از نمودار توانایی ها و نمونه کار و … . بلکه هدفم اینه که تجربه هایی که برای حل مسائل و چالش ها به دست میارم را اینجا با بقیه به اشتراک بزارم.

انتخاب قالب

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

تغییرات فارسی را می خوام pull request بدم به repository اصلی ولی فکر میکنم به خاطر قراردادن فایل های فونت فارسی ممکنه پذیرفته نشه.

قالب را می تونید از لینک دانلود کنید.

برای فونت قالب هم از ایران سنس که قبلا خریده بودمش، تحت لایسنس غیر تجاری استفاده کردم.